汉诺塔问题和青蛙跳台阶问题(递归)

一、汉诺塔问题

汉诺塔问题:有A、B、C三根柱子,最初A上有n个圆盘,自下而上盘子由大到小放置,要求将A上的圆盘按照原样移动到C柱上,每次只能移动一个圆盘,且在B柱或C柱上边的圆盘依旧按照自下而上盘子由大到小放置。

思路:将A柱上的n-1个圆盘移到B柱上,再将A柱上的最后一个圆盘移到C柱上,最后一步将B柱上的n-1个圆盘移到C柱上。这样即完成了任务。但是如何将A柱上的n-1个圆盘按照自下而上由大到小放置在B柱上呢?

这里我们可以将A柱上的n-1个圆盘按照自下而上由大到小放置在B柱上的问题看做是一个新的汉诺塔问题。即需将A柱上的n-1个圆盘按照自下而上由大到小方式移动到B柱上(此时B柱就相当于原来的C柱)。这里也恰好满足递归的思想,将大型复杂的问题层层简化为与原问题相似的规模较小的问题


int i = 0;//在这里定义一个全局变量记录移动步骤
void move(char x, char y) {
    printf("第%d步:%c---->%c上\n",++i, x, y);
    //i++表示先赋值再加一,(++i)则表示先加一再赋值
}
void mind(int x,char A, char B, char C) {
    if (x == 1) {
        move(A, C);
    }
    else {
        mind(x - 1, A, C, B);//将A上的x-1个盘子从A移至B(以B作为中介)
        move(A, C);//将A上剩下的一个盘子移至C
        mind(x - 1, B, A, C);//再将B上的x-1个盘子移至C
    }
}
int main() {
    int sum = 0;
    scanf("%d", &sum);
    mind(sum,'A', 'B', 'C');
    return 0;
}

二丶青蛙跳台阶问题

青蛙跳台阶问题:青蛙一次能跳上一个台阶,也能一次跳上两个台阶。问青蛙跳上n级台阶共有多少种跳法?

思路:只有一级台阶时,青蛙只有一种跳法,有两级台阶时,青蛙有两种跳法。将这两种情况视为最简单的两种情况,当台阶数大于2时,就采用递归,层层简化。


int jump(int x) {
    if (x == 1)    //台阶只有一个时只有一种跳法
        return 1;
    if (x == 2)//台阶只有两个时有两种跳法
        return 2;
    return jump(x - 1) + jump(x - 2);//这里求和是求出跳一步和跳两步的总共情况
}
int main() {
    int a = 0;
    scanf("%d", &a);
    int sum = jump(a);
    printf("共有%d种跳法\n", sum);
    return 0;
}

如有指正,请私信我纠正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值