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)