You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改斐波那契递归函数以返回递归树节点数?

递归斐波那契树节点数计算代码修正

已知计算第n个斐波那契数的递归树节点数等于加法次数减1,原代码可返回计算过程中的加法次数,但直接对返回值做减1操作的修改方式不生效,核心问题是重复递归调用导致计算逻辑偏差。

原代码

def main():
    print('(Fn, additions)')
    for i in range(0, 11):
        print(f"F({i}) = {fibR(i)}")

def fibR(n):
    # 基准情况
    if n == 0 or n == 1:
        add = 0
        return (n, add)

    return (fibR(n-1)[0] + fibR(n - 2)[0], fibR(n-1)[1] + fibR(n - 2)[1] + 1)


if __name__ == '__main__':
    main()

错误修改尝试

用户直接在返回时对加法次数减1,但这种写法会让fibR(n-1)和fibR(n-2)被重复调用两次,既降低效率,又会因多次减1导致节点数计算错误:

return (fibR(n-1)[0] + fibR(n - 2)[0], (fibR(n-1)[1] + fibR(n - 2)[1] + 1) - 1)

正确修改方案

要解决问题,需同时做到两点:避免重复递归调用、按节点数的递推逻辑计算。节点数的递推公式为:当前节点数 = 左子树节点数 + 右子树节点数 + 1(当前调用节点)。

修改后的完整代码:

def main():
    print('(Fn, node_count)')
    for i in range(0, 11):
        print(f"F({i}) = {fibR(i)}")

def fibR(n):
    # 基准情况:n=0或1时无递归分支,节点数为0
    if n == 0 or n == 1:
        return (n, 0)
    
    # 仅调用一次左右子树,避免重复计算
    left_result = fibR(n-1)
    right_result = fibR(n-2)
    
    fib_value = left_result[0] + right_result[0]
    node_count = left_result[1] + right_result[1] + 1
    
    return (fib_value, node_count)


if __name__ == '__main__':
    main()

验证预期输出

运行修改后的代码,输出与预期完全一致:

(Fn, node_count)
F(0) = (0, 0)
F(1) = (1, 0)
F(2) = (1, 0)
F(3) = (2, 1)
F(4) = (3, 3)
F(5) = (5, 6)
F(6) = (8, 11)
F(7) = (13, 19)
F(8) = (21, 32)
F(9) = (34, 53)
F(10) = (55, 87)

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:08:32