2014-01-05 3 views
2
def g(n): 
"""Return the value of G(n), computed recursively. 

>>> g(1) 
1 
>>> g(2) 
2 
>>> g(3) 
3 
>>> g(4) 
10 
>>> g(5) 
22 
""" 
if n<=3: 
    return n 
else: 
    return g(n-1)+2*g(n-2)+3*g(n-3) 

Как это преобразовать в итеративную функцию? До сих пор я не понимал, что писать рекурсивную функцию иногда проще, чем писать итеративный. Причина, по которой это так сложно, я думаю, потому что я не знаю, какую операцию выполняет функция. В рекурсивном, это не очевидно, что происходит.Python: преобразовать эту рекурсивную функцию в итеративный

Я хочу написать итеративное определение, и я знаю, что мне нужно использовать цикл while, но каждый раз, когда я пытаюсь записать его, я добавляю дополнительные параметры в g_iter (n) (когда их должно быть только одно) или я делаю рекурсивный звонок. Может кто-нибудь хотя бы начать меня по правильному пути? Вам не нужно давать мне полное решение.

FYI: Мы не узнали о слишком распространенном «стеке», которое я вижу на всех этих страницах. Я предпочел бы держаться подальше от этого.

def g_iter(n): 
"""Return the value of G(n), computed iteratively. 

>>> g_iter(1) 
1 
>>> g_iter(2) 
2 
>>> g_iter(3) 
3 
>>> g_iter(4) 
10 
>>> g_iter(5) 
22 
""" 
"*** YOUR CODE HERE ***" 
+0

О'кей ... Итак, это только первый материал среднего класса, и мы не должны знать ** списки ** или ** для цикла ** (только пока). Есть ли более простой способ, чем @falsetru и @thefourtheye? – awalllllll

ответ

5
def g(n): 
    if n <= 3: 
     return n 
    a, b, c = 1, 2, 3 
    for i in range(n - 3): 
     a, b, c = b, c, c + 2 * b + 3 * a 
    return c 

ОБНОВЛЕНИЕ ответ на комментарий, без использования for цикла.

def g(n): 
    if n <= 3: 
     return n 
    a, b, c = 1, 2, 3 
    while n > 3: 
     a, b, c = b, c, c + 2 * b + 3 * a 
     n -= 1 
    return c 
+0

+1 Это то, что я имел в виду, но закончил со списком метода :( – thefourtheye

+0

Как это сделать без цикла for? Мы не должны это знать: P – awalllllll

+1

@ user3147711, я добавляю код, который используйте цикл while, а не цикл 'for'. – falsetru

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