2016-11-11 3 views
1

У меня есть функция, которая определяется таким образом:Итерационной версию этой рекурсивной функции

F(n) = nif n<=3

F(n) = F(n-1) + 2 * F(n-2) + 3 * F(n-3)if n>3

Теперь, я написал это как рекурсивная функция, и она отлично работает. Я пытаюсь написать его как итеративную функцию, но я не могу заставить ее произойти.

Выход должен быть, например:

print(FRec(5)) =>  22 
print(FRec(10)) => 1657 
print(FRec(15)) => 124905 

Любые советы?

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

def FRec(n): 
    if(n <= 3): 
     return n 
    if(n > 3): 
     return FRec(n - 1) + 2 * FRec(n - 2) + 3 * FRec(n - 3) 
+0

Это примеры, взятые из рабочего листа и точный результат рекурсивной функции. – mrpink121

+1

А, нет, мои навыки чтения сбиты. Я отредактирую ваше сообщение, чтобы избежать этой ошибки для других. –

+0

@MartijnPieters Сумма не F (n-1) + F (n-2) + F (n-3), это F (n-1) + 2F (n-2) + 3F (n-3) , 1 * 3 + 2 * 2 + 3 * 1 = 10 и 1 * 10 + 2 * 3 + 3 * 2 = 22. – BallpointBen

ответ

3

Все, что вам нужно держать последние 3 результаты:

from collections import deque 

def F_iter(n): 
    if n <= 3: 
     return n 
    prev = deque([1, 2, 3], maxlen=3) 
    for i in range(4, n + 1): 
     result = prev[-1] + 2 * prev[-2] + 3 * prev[-3] 
     prev.append(result) 
    return prev[-1] 

Если deque не «доступен» для вас, то вы можете нерационально заменить что с некоторым списком нарезки и конкатенации:

prev = [1, 2, 3] 
    for i in range(4, n + 1): 
     result = prev[-1] + 2 * prev[-2] + 3 * prev[-3] 
     prev = prev[1:] + [result] 

Демонстрация:

>>> F_iter(5) 
22 
>>> F_iter(10) 
1657 
>>> F_iter(15) 
124905 
+0

Спасибо! Но есть ли способ сделать это без deque? Я только в начале этого урока Python в колледже, и наше задание специально говорит о том, что мы не используем инструменты, которые еще не были охвачены. – mrpink121

+0

Вы можете использовать список, затем удалить первый элемент и каждый раз добавлять новое в конце: 'prev = [1, 2, 3]' и 'prev = prev [1:] + [sum (prev)]' , Это не так эффективно, как двойная очередь. –

+0

Большое спасибо за вашу помощь. К сожалению, нам еще предстоит охватить списки. Но я получил общую идею, и я попытаюсь перевести ее на то, что удовлетворяет моего единомышленника. – mrpink121

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