数据结构---递归

数据结构–递归

最开始接触到递归的时候是在去年学Python基础语法的时候,那时候刚入门,就跟着网课去写汉诺塔问题的过程求解,想了好久都一直没有搞懂,最后只能放弃,后面慢慢的学习,慢慢对于递归有了一些理解,但是一直都没有重新去整理学习,这几天数据结构刚好重新学到递归,可以说是对于递归有了更加深刻的认识。

使用递归的条件:

1.问题可以分解成子问题,且问题和子问题之间只有数据的不同,处理过程完全相同。
2.存在终止条件。
递归不同于其他算法或者结构,它不需要我们想清楚每一个递归的过程,因为这是不现实的,而计算机就恰好擅长这方面,对于计算机来说只不过是循环在调用一个函数而已。而我们要做的就是明确要求解的问题和子问题之间的关系(不用纠结子问题的子问题以及之后的所有问题),出除递归公式,然后再找到终止条件,然后借助它们写出代码,解决问题。

写递归代码的方法

1.找到递归公式。
2.找到终止条件。

实例:汉诺塔问题

#include<iostream>
using namespace std;
//汉诺塔问题
//有A,B,C三个柱子,A上有n个圆盘且从上到下为从大到小排序,移动圆盘,借助B,将A上的圆盘都移动到C上,
//移动过程中必须满足每根柱子上都是大的圆盘在下

//递归公式
// f(n:移动次数,A->C,B)=f(n-1,A->B,C)+a->c+f(n-1,B->C,A)
// f(n:移动次数,source->target,middle)=f(n-1,source->middle,target)+s->t+f(n-1,middle->target,source)
//终止条件
//n=2    s->m s->t m->t

//n:移动的圆盘个数,source:要移动的柱子,target:目标柱子,middle:过渡柱子
void func(int n, char source, char target, char middle)
{
	if (n == 2)
	{
		cout << source << "->" << middle<<endl;
		cout << source << "->" << target << endl;
		cout << middle << "->" << target << endl;
	}
	else
	{
		func(n - 1, source,middle, target);
		cout << source << "->" << target << endl;;
		func(n - 1, middle,target, source);
	}
}

int main()
{
	func(4, 'A', 'C', 'B');
}

结果

A->B
A->C
B->C
A->B
C->A
C->B
A->B
A->C
B->C
B->A
C->A
B->C
A->B
A->C
B->C

利用递归解决问题时需要注意的几个问题
1.栈溢出(递归次数太多导致栈溢出)
2.当函数结果是某个数据时,要避免重复计算(解决办法:可以将每一次结果记录下来,调用函数时先查找之前是否计算过,若计算过则直接使用之前的结果)
3.多次重复调用函数会导致空间复杂度很高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值