递归与回溯实际例子(类比汉诺塔)

场景1:

上着数学课,小明突然想问问小红有没有男朋友,可是小红坐在教室的右下角,小明在左上角,相隔天涯,于是写了一张纸条。接着对后桌说:“传给小红。”。后桌拿到后对Ta的后桌说:“传给小红”。这个时候神奇的递归就发生了。

在这个例子中,行为目的是传给小红,终止条件是对象为小红。用伪代码来表达就是。

void transport(int rest) // rest是距离小红还有几个人
{
    if (rest == 0)
        cout<<"你有没有男朋友"<<endl;
    else
        transport(rest - 1);
}

挺有意思

这里函数的目的是将纸条传递给剩余的rest个人。而关键的地方在于,我们只需要知道当rest为0的时候它的目的是什么,我们就可以确定整个函数的目的。

同样的思路,在汉诺塔问题中,我们先构建一个函数

void hanio(int n, char a, char b, char c)// n个圆盘
{
    if (n == 1)
    {
        cout<<a<<"->"<<c<<endl;
        return;
    }
    --------------
}

这个函数的结束条件告诉我们,它的目的是将a传递给c,那么接下来我们就利用这个函数的意思。

当n大于1的时候,我们需要先将最底下的圆盘上面的所有圆盘都搬到b,然后再将最底下的圆盘搬到c,最后将其他圆盘搬到c。由于函数hanio的意思是将前n个圆盘从a搬到c,那么我们只需要补充三个步骤<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值