7 累加&汉诺塔的递归实现

目录

一 概述

二 代码

2.1 累加代码

2.2 汉诺塔代码

三 总结&反思


一 概述

递归是一种很适合计算机的实现方式,在计算机内部是使用栈来实现的,递归的优点是空间复杂性比价低,代码短。但是也有一定的缺点,就是并不是那么高效(时间上),以及并不适合并行化,汉诺塔还是很有意思的一个代码(虽然我一直在被他摧残)

二 代码

2.1 累加代码

#include<stdio.h>
#include<stdlib.h>

//累加的递归形式
int add(int num) {
	if (num == 1)
		return 1;
	else{
		return num + add(num - 1);
	}
}
int main() {
	int number;
	printf("请输入累加的最后一个数字:\n");
	scanf("%d", &number);
	printf("累加后的数字为:%d\n", add(number));
}

这个没什么好说的,回想我们高中做过的有关数列的递推关系的题目,比如f(i)=f(i-1)+f(i-2)

核心的递归函数就类似于这个。

运行结果:

 

2.2 汉诺塔代码

void move(char pos1, char pos2)
{
	printf(" %c->%c ", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
		move(pos1, pos3);
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}
int main()
{
	Hanoi(1, 'A', 'B','C');
	printf("\n");
	Hanoi(2, 'A', 'B', 'C');
	printf("\n");
	Hanoi(3, 'A', 'B', 'C');
	printf("\n");
	return 0;
}

        这里只给到了截至到3的测试样例。

        其实这里分两种情况讨论皆可

        一种是等于1 直接把A移到C

        一种是大于等于2 

        需要将 n– 1 个盘子从 A 移动到B

        将编号为 n 的盘子从 A 移动到C

        将 n– 1 个盘子从 B 移动到C

        很明显这几步是可以用递归去做的,也就是我们上面展现的核心递归代码

        运行结果:(去年期末的痛)

        

三 总结&反思

        递归是一种思维,这种思维不太好理解,因为区别于我们平常的线性思考方式,同样也就体现在了其优越的空间复杂度上。

        跟踪递归算法的适合,尽量选用n值较少的情况,否则会比较头大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值