2010-06-01 16 views
0

у меня довольно трудно понять, что происходит здесь не так:функция Рекурсия не работает должным образом

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) 

Например,

x=iterate() 
x.iterated(5) 

выходы None. Он должен вывести 6, потому что длина будет выглядеть так: 5 -> 16 -> 8 -> 4 -> 2 -> 1

После выполнения некоторой отладки, я вижу, что возвращается self.length правильно, но что-то не так в рекурсии. Я не совсем уверен. Спасибо за любую помощь.

+0

Я любопытно, какая версия Python вы используете? Обычно я использую Python 2.6, а init должен быть объявлен как __init__. Но это явно работает для вас, так что мне интересно, какая версия Python позволяет это – inspectorG4dget

+0

@ inspectorG4dget - предоставленный исходный код имел двойные подчеркивания вокруг 'init', но они были первоначально удалены форматированием и не отображались (что я ' m угадывание - это то, что также произошло с вашим комментарием). Я исправил форматирование для вопроса сейчас. –

+0

@ire_and_curses: Кажется. Похоже, двойное подчеркивание - это форматирование текста для смелых! – inspectorG4dget

ответ

4

В двух блоках elif вы не возвращаете значение после выполнения рекурсивного вызова. Вам нужен return перед рекурсивными вызовами iterated (например, return self.iterated(n/2)). Если вы явно не указали return, функция вернет None.

Это исправление этой проблемы, но есть способ сделать ваш код более простым: вам действительно не нужен элемент length. Вместо этого, вы можете добавить 1 к результату рекурсивного вызова:

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)) 

Это не нужно быть в классе, так как нет необходимости в каких-либо членов.

3

Вы упускаете возврата заявления:

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) 
+0

Ahh ... grr большое спасибо, что разочаровывало – jakecar

1

Вы только возвращает значение из самого глубокого уровня рекурсии, то игнорируя его на втором глубинном уровне.

Все self.iterated(...) линии следует читать return self.iterated(...)

1

Вы должны закончить каждую Элиф ветвь с return self.iterated(...), а не просто self.iterated(...)

Смежные вопросы