-3

目标:修改递归斐波那契函数以打印其局部变量和递归调用参数。对于每个递归调用,在单独的行上显示输出并添加缩进级别。

我试过了:

from pprint import pprint
def fib(n):
    if n == 0 or n == 1:
        return 1

    pprint(f" fib({fib(n - 1)})")
    pprint(f" fib({fib(n - 2)})")
    fib(n - 1) + fib(n - 2)

    return fib(n - 1) + fib(n - 2)


fib(5)

第一个问题:

例如,当我调用fib(5)它时,它不会打印 fib(5) 或 fib(4)。我该如何解决?

4

2 回答 2

2

您正在尝试将结果嵌入到fib(n-1)您的字符串中;你只想要n-1

from pprint import pprint

def fib(n):
    if n == 0 or n == 1:
        return 1

    pprint(f" fib({n - 1})")  # f" fib({fib(n - 1)})"
    pprint(f" fib({n - 2})")
    fib(n - 1) + fib(n - 2)

    return fib(n - 1) + fib(n - 2)


fib(5)
于 2020-04-06T18:24:06.040 回答
1

如果调用fib(5)它就不能写fib(5),因为fib(5)等于fib(4) + fib(3)。此外,您所做的修改确实很糟糕,因为您拨打了两次电话。所以,我建议你下一个代码:

def fib(n):
    if n <= 1:
        return n
    else:
        n_minus_one = fib(n - 1)
        n_minus_two = fib(n - 2)

        print(f'call: fib({n-1}) value={n_minus_one}')
        print(f'call: fib({n-2}) value={n_minus_two}')

        return n_minus_one + n_minus_two


print(fib(5))

或者,如果您不想查看值:

def fib(n):
    if n <= 1:
        return n
    else:
        print(f'call: fib({n-1})')
        print(f'call: fib({n-2})')

        return fib(n-1) + fib(n-2)


print(fib(5))

我希望我对你有所帮助。

于 2020-04-06T18:39:35.660 回答