递归

本文深入探讨了递归的概念,通过斐波那契数列、辗转相除法、插入排序、汉诺塔问题、二分查找和希尔排序等经典例子,详细解释了递归的实现方式和问题拆解策略。同时,提到了递归算法的时间复杂度分析,并讨论了递归在不同场景下的应用,如排序算法的稳定性。
摘要由CSDN通过智能技术生成

模板:
1** name(2参数)
{
3.返回条件
4.问题拆解…
}

所谓递归,无非是将一个问题拆解为一个或多个小问题并且给出所有递归出口的情况(5)
上面标注出的1,2,3,4,5每一个都有可能是当前问题的难点,如何解决,就需要多多看题解,多多写题了.

eg:斐波那契数列

int fib(int n)
{
   
	if(n==1||n==2)
	return 1;
	return fib(n-1)+fib(n-2);
}

我们就这个题目和详细看一下:
1.返回值:我们求的是斐波那契的数列和,那么返回值为int

2.参数:***当前***参数为N时,问题可以分解为前N-1项和前N-2项的和的累加,所以,一个参数N就够了

3.返回条件,这里特别要注意,问题的子规模为N-1和N-2,那么我们应该保证N-2大于等于0,从第零项开始算起,数列依次为1 1 2 3 5 8 13…
所以终止条件就是当递归到第一个’1’,第二个’1’时结束.此时返回1

4.问题拆解:其实三和四的顺序不是固定的,更多的是考虑一种情况的拆解,拆解为子问题后再判断终止条件,至于怎么拆解,我们可以通过手动模拟和积累经验慢慢来分解.手动模拟就是读懂题目并能够充分挖掘题目条件.
多分支递归相当于是一颗树形结构
单分支递归相当于是一条道走到黑

eg:用递推公式求最大公约数
数学原理(问题划分为子问题的基础):辗转相除法
m%n=k k!=0
比如4和2, %2=0,所以2就是最大公约数

int func(int n,k)
{
   
	(n%k==0? retrun k: return k%func(k,n%k));
}

这里代码写的不太好理解,大家可以手动模拟一下(#^ . ^#)

eg:递归形式写插入排序
1.划分:对数组的0~N-1进行排序
<->对数组的0~N-2进行排序,再将最后一个元素插入
就这样:问题缩小了一个规模

void insert_sort(int []arry,int k)
{
   
	insert_sort(array,k-1);	//重点1
	int x=arry[k];
	int index=k-1;
	while(x<arry[index]){
   
		arry[index+1]=arry[index];//index指向的元素后移
		index--;
	}
	array[index+1]=x;		//重点2

}

重点1:这里的insert_sort的位置很有讲究,我们在讲划分子问题时,假设的是K前面的数组都是有效的,所以这要求我们先进入到最后一个递归状态,直接return后开始依次将第二个元素插入到前面的位置中,当前递归结束后倒数第三层递归再对第三个元素进行插入,结束本层递归后,退回到第四层递归,再对第四个元素进行插入排序…依次进行
终点2:当插入的元素是7时,当前数组为
…6, 8,9…
此时的index指向的元素为8,后移后变为
…6,8,8…
此时index经过–操作后指向6,所以我们插入的位置就该是index+1,而不是index,这点要格外注意

eg:汉诺塔问题
问题描述:
https://blog.csdn.net/qq_37873310/article/details/80461767
问题的划分说简单也算简单,说难也有点难度
总体思想是将N-1个盘子通过目标柱的帮助移到辅助盘,将最后一个盘子移动到目标盘,再将这N-1个盘子通过原始盘的帮助移动到目标盘.就是这样简单粗暴O(∩_∩)O哈哈~

#include<iostream>
#include<cstdio> 
using namespace std;

void Hanio(char A,char B,char C,int k) 	//假设初始时都在A,要移动到C 
{
   
	if(k==0)	return ;
	Hanio(A
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shallow_Carl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值