汉诺塔递归栈
问题抽象
个塔, 个碟子
初始:所有碟子放在 号塔,大的在底下,小的在上面
任务:把碟子移动到 号塔,顺序不变, 可用 号塔辅助
限制
每次只能移动一个碟子
总是大碟子在下,小的在上
递归解法
移动碟子的方法:
将 个碟子从 移到 , 辅助
可分解为 个步骤
将 个碟子从 移到 :
将最大的碟子从 移到
将 个碟子从 移到 :
汉诺塔递归程序
!!"#$%
!!&'
()
*
+,--."$%.--
--.$.----/*
*0
0
1最少次数,2
一般递归程序转换为循环
递归函数主体的转换
转换为循环,#/即可
递归调用的转换
将当前参数、局部变量…(活动记录)压栈
参照调用方式改变参数,继续循环
函数执行结束——递归返回的处理
若栈空,整个递归过程结束,跳出循环
否则,将调用者的活动记录弹出栈,恢复其环境,继续循环
递归函数不同入口的区分——返回地址的处理
上例:3456473、895:、:374;
活动记录的一部分,与参数、局部变量一同压栈、出栈
在循环主体中,根据当前活动记录的入口值,执行不同代码
汉诺塔的递归栈实现
<+/,-#(
<+/,-/=#(
<+/,->#(