La función de recursión no funciona correctamente

Me está costando bastante averiguar qué está 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 dar salida a 6 porque la longitud se vería así: 5 -> 16 -> 8 -> 4 -> 2 -> 1

Después de hacer un poco de depuración, veo que el self.length se devuelve correctamente pero algo sale mal en la recursión. No estoy realmente seguro. Gracias por cualquier ayuda.

En los dos bloques elif , no devuelve un valor después de hacer la llamada recursiva. Necesita una return antes de las llamadas recursivas a iterated (p. Ej., 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 su lugar, 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.

Te estás perdiendo las declaraciones de retorno:

 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) 

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

Todas las self.iterated(...) deben leerse return self.iterated(...)

Debería terminar cada twig elif con el return self.iterated(...) lugar de solo self.iterated(...)