终于和“递归”成为了好朋友

1.经典的汉诺塔问题:

(1)首先推荐一个汉诺塔小游戏,为了对该知识点更容易理解。

(2)如下图所示,由左至右分别为a,b,c三个底座,该游戏的目的是要让a座上的三个圆盘按照从上到下由小到大的顺序放在c底座。下图展示的是三个圆盘要进行转移,转移的顺序依次应为:a->c、a->b、c->b、a->c、b->a、b->c、a->c。

(3)程序详解:

// 将 n 个圆盘从 a 经由 b 移动到 c 上
public void hanoid(int n, char a, char b, char c) {
    if (n <= 0) {
        return;
    }
    // 将上面的  n-1 个圆盘经由 C 移到 B
    hanoid(n-1, a, c, b);
    // 此时将 A 底下的那块最大的圆盘移到 C
    move(a, c);
    // 再将 B 上的 n-1 个圆盘经由A移到 C上
    hanoid(n-1, b, a, c);
}

public void move(char a, char b) {
    printf("%c->%c\n", a, b);
}

该代码参考自https://mp.weixin.qq.com/s/Hew44D8rdXb3pf8mZGk67w,该篇文章中对递归也有很详细的讲解。

首先调用函数hanoid( 3 , a , b , c ),以下简写为h( 3 , a , b , c )。

如上图所示,为递归的详细推导过程,颜色相同的三个方块为一组,箭头表示执行顺序,例:执行h(0,a,c,b)返回空,则继续执行h(1,a,b,c)函数内的下一行命令,直至执行完函数内的全部命令,则该函数执行结束,释放内存空间。

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值