递推递归算法

初见安~讲深搜前我们先讲讲递归:)

二.递推

递推,顾名思义就是根据已有的推出未知的。很简单,斐波那契数列就是一个很典型的例子:
斐波那契数列
那我们就以此作为例题看看吧:
要求输入:一个整数n
输出:斐波那契数列的第n个数。
斐波那契数列的规律也显而易见:第n个数的值为第n-1个数和第n-2个数的和。

这道题的递推操作的实现,我们可以用到for循环:

#include<iostream>
using namespace std;
int main()
{
	int ans[100],n;//ans存储数列
	cin>>n;//读入
	ans[1]=1;//初始化定义,两个即可
	ans[2]=1;
	for(int i=3;i<=n;i++)//从3开始,避免非法操作。
	{
		ans[i]=ans[i-1]+ans[i-2];	//递推累加
	}
	cout<<ans[n];//输出
	return 0;
}

所以递推是很好理解的:)

三.递归

递归其实是一个比较大的思想了。它和递推的区别就在于:递推是根据一个公式往前推过去,而递归则是层层深入,直到边界后再返回。相当于多了一个回溯的过程。
实现递归,我们需要自己定义函数并自身调用,即程序嵌套。
这是什么意思呢?可能有点难理解。简单举个例题吧:
求2的x次方。
要求输入:一个整数x
要求输出:2的x次方

很简单的一道题——相信你第一反应是可以用for循环来做。为了理解,我们用递归实现试试。

先写好框架吧:

#include<iostream>
using namespace std;
int main()
{
	int x,ans=1;
	cin>>x;
	cout<<digui(x);//digui为自己定义的函数的函数名。
	return 0p;
}

接下来写自己定义的函数:
void是指无返回值的函数。

void digui(int i)//前文主函数里的x传送到这里,作为变量i——剩下的次方数。
{
	if(i==0) return;//到达边界,返回。
	ans*=2;
	digui(i-1);
}

如果就这样了的话,编译器会告诉你各种没有定义的错误。
首先是void digui(int i)没有定义。C++在编译过程中,会有个从上到下的顺序,但也会先访问主函数int main();但在主函数中遇到了一个自定义的函数,就会去查找——在主函数之前去找。所以我们要把digui定义在主函数前面。
其次就是ans未定义。这里我们主函数里定义了,为什么在自定义函数里又说没有定义了?因为就如同上方自定义函数里的int i一样,在哪里定义,就只能在哪里用。所以int main里的ans只能在主函数里调用,在digui里不曾定义。若为了方便,可以定义全局变量——在主函数外定义。标城如下:

#include<iostream>
using namespace std;
int x,ans=1;//全局变量
void digui(int i)
{
	if(i==0) return;
	ans*=2;
	digui(i-1);
}
int main()
{
	cin>>x;
	digui(x);
	cout<<ans;
	return 0;
}

这样我们得到的就是2的x次方了:)

如果有兴趣的话,求x的y次方有一个专门的函数:pow(int x ,int y)。有一道题叫做快速幂,是这一方法的一个优化,也可以了解一下。毕竟这样算数据量一旦大了就很容易超时(很久才出结果)。

这一应用上,我们可以发现:递归实现的自我调用其实可以用for循环实现。简单的递归也都的确如此,类似于逆序输出也可以用for循环逆序下标输出。

我们再来看一个递归的应用:
已知:
在这里插入图片描述 计算x=4.2,n=10以及x=2.5,n=15时的f的值。
不要觉得你可以手算:)根号这种无理数只能用夹逼法算是很痛苦的。
这道题也很明显的用递归,向自己定义的函数传数据两次就可以了。
由这一公式我们也可以化简为我们的递推式:
在这里插入图片描述
所以我们可以开始敲代码了:
P.S:sqrt(int x)为#include中的标准函数,求x的平方根

#include<iostream>
#include<cmath>
using namespace std;
double digui(int x,int n)
{
	if(n==1) return sqrt(x+1);//到达边界,开始回溯
	return sqrt(digui(x,n-1));//没有到达边界,则继续深入
}

int main()
{
	cout<<digui(4.2,10)<<endl;
	cout<<digui(2.5,15);
	return 0;
}

有没有突然觉得递归很方便呢~这个思想是很简单的,而难在运用。比如我们下文将讲述的——深度优先搜索(DFS)。

迎评:)
——End——

猜你喜欢

转载自blog.csdn.net/qq_43326267/article/details/82946956