递归之汉诺塔问题 #学习笔记

一、递归算法

1. 递归的简单定义
递归是指在定义自身的同时又出现了对自身的应用。如果一个函数在其定义体内直接调用自己,则称为递归函数(其中有直接递归函数和间接递归函数的区别)

2. 递归定义的数学函数
例如 二阶斐波那契(Fibonacci)数列定义如下
F[n]=F[n-1]+F[n-2] (n>=2,F[0]=0,F[1]=1)
二阶斐波那契数列公式

二、递归算法解决汉诺塔问题
实现汉诺塔塔盘转移
三个塔为A、B、C塔,将塔A的所有盘移动到C盘去
只考虑3个盘即n=3的情况下:
从塔顶开始排序
必须将底盘即第3个盘(最下面的、最大的盘)盘3先移到C盘去,就得先把它头上的所有盘(视作一个整体)移动到B盘去。最后再将盘3移到盘C去此步尚未完成

则 问题 进入到(重复调用自己)

将盘1盘2移动到B盘去,必须把最大的盘2移到B盘去,就得先把它头上所有的盘(此刻为盘1)移动到C盘去。最后再将盘2移到B盘,盘1从C盘移到B盘此步尚未完成

则 问题 进入到(重复调用自己)

将盘1移动到C盘去,发现它头上没有盘了,可以直接移动。则此步完成,而这一步属于上一步,此步的完成作为一个返回值(也是整个递归的终止条件,开始返回)

回到上一步即第二步,第二步有两个步骤,它的第一个步骤已经成功,进行它的第二步,此后第二步本身也成功,此步的成功又返回值它的上一步第一步,同理,第一步也成功了

最终实现了盘3在C盘底部,盘1,盘2在B盘的目的。
同理,再将塔B所有的盘按要求移动到C盘去。
其实上述步骤也只是全过程的一个步骤,我们研究n个盘的问题,以最下面的盘为研究对象,重复调用这个”移动盘的函数“,直到最下面的盘就是盘1的时候,目的就达到了

在上面的过程中经历了一个递归调用的过程,有必要的终止条件,是一种分而治之、化繁为简的过程,易于分析不过时空效率低下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维何M762

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值