una sintaxis recursivo recursividad recursivas recursiva programacion programa ordenar lista funciones funcion ejemplos eficiencia con python recursion

python - sintaxis - La función de recursión no funciona correctamente



recursividad python (4)

Estoy teniendo un momento difícil para descubrir qué está pasando mal aquí:

class iterate(): def __init__(self): self.length=1 def iterated(self, n): if n==1: return self.length elif n%2==0: self.length+=1 self.iterated(n/2) elif n!=1: self.length+=1 self.iterated(3*n+1)

Por ejemplo,

x=iterate() x.iterated(5)

salidas None . Debería mostrar 6 porque la longitud sería así: 5 -> 16 -> 8 -> 4 -> 2 -> 1

Después de hacer algunas depuraciones, veo que self.length se devuelve correctamente, pero algo va mal en la recursión. No estoy realmente seguro. Gracias por cualquier ayuda.


Debes terminar cada rama elif con return self.iterated(...) lugar de self.iterated(...)


En los dos bloques elif , no devuelve un valor después de realizar la llamada recursiva. Necesita una return antes de las llamadas recursivas iterated (por ejemplo, return self.iterated(n/2) ). Si no return explícitamente, la función devolverá None .

Eso solucionará este problema, pero hay una manera de simplificar su código: en realidad no necesita la length miembro. En cambio, puede agregar 1 al resultado de la llamada recursiva:

def iterated(n): if n==1: return 1 elif n%2==0: return 1 + iterated(n/2) else: return 1 + iterated(3*n+1) print(iterated(5))

Esto no necesita estar en una clase, ya que no hay necesidad de ningún miembro.


Solo está devolviendo un valor del nivel más profundo de recursión, y luego lo ignora en el segundo nivel más profundo.

Todas las self.iterated(...) deberían leer return self.iterated(...)


Te estás perdiendo las declaraciones de devolución:

class iterate(): def init(self): self.length=1 def iterated(self, n): if n==1: return self.length elif n%2==0: self.length+=1 **return** self.iterated(n/2) elif n!=1: self.length+=1 **return** self.iterated(3*n+1)