【 递归实现累加与汉诺塔问题】

递归实现累加与汉诺塔问题

1.在计算从1到n的累加时,可以使用for循环,也可以使用递归来实现,本篇内容将使用递归实现
核心内容就是递归的公式:

int addTo(int paraN) {
    int tempSum;
    printf("entering addTo(%d)\r\n",paraN);
    if(paraN<=0){
        printf("return 0\r\n");
        return 0;
    }
    else {
        tempSum=addTo(paraN-1)+paraN;
        printf("return %d\r\n",tempSum);
        return tempSum;
    }
}

其实简化一下就是这个意思:

int clearAddTo(int paraN) {
	if (paraN <= 0) {
		return 0;
	} else {
		return clearAddTo(paraN - 1) + paraN;
	}
}

其实使用递归来实现累加并不复杂,只要能够写出核心代码就可以,除此之外,递归还可以应用到更加复杂的问题上
2.汉诺塔问题是使用递归来实现的一个经典例子
汉诺塔上的盘子移动过程:
请添加图片描述

汉诺塔的核心代码:

void hanoi(int paraN,char paraSource,char paraTransit,char paraDestination){
    if(paraN<=0){
        return;
    }else {
        hanoi(paraN-1,paraSource,paraDestination,paraTransit);
        printf("%c-->%c\r\n",paraSource,paraDestination);
        hanoi(paraN-1,paraTransit,paraSource,paraDestination);
    }
}

全部代码:

#include<stdio.h>
void hanoi(int paraN,char paraSource,char paraTransit,char paraDestination){
    if(paraN<=0){
        return;
    }else {
        hanoi(paraN-1,paraSource,paraDestination,paraTransit);
        printf("%c-->%c\r\n",paraSource,paraDestination);
        hanoi(paraN-1,paraTransit,paraSource,paraDestination);
    }
}

void hanoiTest(){
    printf("---hanoiTest begin---");
    printf("2 plates\r\n");
    hanoi(2,'A','B','C');

    printf("3 plates\r\n");
    hanoi(3,'A','B','C');
    printf("---hanoiTest ends---\r\n");
}
void main(){
    hanoiTest();
}

运行结果:

---hanoiTest begin---
2 plates
A-->B
A-->C
B-->C
3 plates
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
---hanoiTest ends---

**总结:**对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:
1.将起始柱上的 n-1 个圆盘移动到辅助柱上;
2.将起始柱上遗留的 1 个圆盘移动到目标柱上;
3.将辅助柱上的所有圆盘移动到目标柱上。

由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值