关于4个圆盘汉诺塔递归算法函数调用次数的疑问
汉诺塔4圆盘递归函数调用次数问题解答
你这里的核心问题是混淆了圆盘移动次数和递归函数调用次数两个概念:
- 你查到的
2ⁿ-1是汉诺塔问题中移动圆盘的总次数,对于n=4来说就是15次,但这和题目问的「函数调用次数」不是一回事。
我们来拆解经典汉诺塔递归函数的调用逻辑,以最常见的实现为例:
def hanoi(n, src, dest, aux): if n == 0: return # base case:没有圆盘需要移动 # 1. 把n-1个圆盘从源柱移到辅助柱 hanoi(n-1, src, aux, dest) # 2. 把第n个圆盘从源柱移到目标柱(这一步是移动操作,不是函数调用) # 3. 把n-1个圆盘从辅助柱移到目标柱 hanoi(n-1, aux, dest, src)
我们用递推公式来计算函数总调用次数:
设 C(n) 为解决n个圆盘问题时的函数总调用次数:
- 当n=0时,调用
hanoi(0)直接返回,所以C(0)=1(这一次调用要算进去) - 当n>0时,当前调用
hanoi(n)算1次,再加上两次递归调用hanoi(n-1)的总次数,即C(n) = 1 + 2*C(n-1)
代入计算:
- C(1) = 1 + 2C(0) = 1 + 21 = 3
- C(2) = 1 + 2C(1) = 1 + 23 = 7
- C(3) = 1 + 2C(2) = 1 + 27 = 15
- C(4) = 1 + 2C(3) = 1 + 215 = 31
所以对应选项里的D选项(31)才是正确答案。
简单总结:
- 圆盘移动次数:
2ⁿ - 1(n=4时15次) - 递归函数总调用次数:
2^(n+1) - 1(n=4时31次)
内容的提问来源于stack exchange,提问作者Cliff Chiang




