在递归函数中打印局部变量和递归调用参数。如何实现?

问题描述 投票:-3回答:2

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

我尝试过:

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)。我该如何解决?

python python-3.x recursion
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)

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

希望我能帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.