C++算法基础(5)--递归算法详解

本篇文章主要讲解算法基础中的重要算法之一递归算法

一.递归算法简介

1.定义

递归算法指一种通过重复将问题分解为同类的子问题而解决问题的方法。或者说递归算法是一种直接或者间接地调用自身的算法。简单来说就是一个方法中会重复调用该方法解决问题,直到满足基础部分的条件而输出终止的算法。

2.特点

(1).递归就是在过程或函数里调用自身。
(2).使用递归算法必须有一个明确的递归结束条件,即递归出口。(重要)

3.递归算法的优缺点

优点:使用递归算法,代码更加简洁,程序自动在方法中调用方法,不需要额外大量代码。
缺点:递归会占用比较多的内存,当递归次数比较多时,性能就会降低且难以理解。

调用栈可能会溢出,函数每一次调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。

总结:虽然递归算法的缺点可能比较多,但是在不考虑执行效率以及内存消耗的前提下,递归算法带来的便利还是很多的。

二.经典案例演示递归算法

1.计算阶乘

int factorial(int n){
	if(n==1)
		return n;
	else
		return n*factorial(n-1);
}
int main()
{
	int n;
	cout<<"请输入整数:"<<endl;
	scanf("%d",&n);
	cout<<"整数:"<<n<<"的阶乘为:"<<factorial(n)<<endl;
	cout<<"\n"<<endl;
	return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述
阶乘的递归算法步骤:
计算4的阶乘factorial(4)时:
1).n=4,首先判断n>2,factorial(4)=4* factorial(3)。
2).计算factorial(3),此时n=3,factorial(3)=3* factorial(2)
3).计算factorial(2),此时n=2,factorial(2)=2。return 2。(递归出口)

合起来的步骤为:
factorial(4)=4* factorial(3)
       = 4* 3* factorial(2)
       = 4* 3* 2* factorial(1)
       = 4* 3* 2* 1=24

思考:不使用递归算法

int fac(int x)
{
	static int f=1;   //静态局部变量
	f*=x;
	return f;
}
int main()
{
	int n;
	cout<<"请输入整数:"<<endl;
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
        fac(i);
	}
	cout<<"整数:"<<n<<"的阶乘为:"<<fac(n)<<endl;
	cout<<"\n"<<endl;
}

结果:
在这里插入图片描述

在这里插入图片描述
这里其实就体现了递归算法的代码简洁的优点,不使用递归算法,那么代码量将会增多,使用的其它方法就变得很多。

再来分析一下不使用递归算法的方法
首先定义了fac函数,其中定义了静态局部变量f,且f=f* x,计算后return f,
那么有人可能会注意到,为何要循环计算fac,最后再获得对应的值?

fac(4)计算步骤:
1).分别计算fac(1)、fac(2)和fac(3)
fac(1):f=1,f=f* x=1,return f=1。
fac(2): f=1,f=f* x=1* 2,return f=2。
fac(3): f=2,f=f* x=2* 3,return f=6。

此时我们会计算并输出fac(4)=6* 4=24。
总结:我们循环计算fac(1)、fac(2)和fac(3)就是为了得到计算fac(3)后的f的值,此时我们计算fac(4)需要使用到这个值。

如果直接计算fac(4)会得到什么值呢?
修改代码:

int main()
{
	int n;
	cout<<"请输入整数:"<<endl;
	scanf("%d",&n);
	/*for(int i=1;i<n;i++)
	{
        fac(i);
	}*/
	cout<<"整数:"<<n<<"的阶乘为:"<<fac(n)<<endl;
	cout<<"\n"<<endl;
}

结果:
在这里插入图片描述
发现结果是错的,因为计算一个数的阶乘不仅仅和此数有关,所以,必须对前面的数进行累积计算。

2.斐波那契数计算

int fib (int n)
{
    if (n <= 0) //base case
        return 0;
    else if (n == 1) //base case
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
int main()
{
int n;
	cout<<"请输入斐波那契第几个数:"<<endl;
	scanf("%d",&n);
	cout<<"第"<<n<<"个斐波那契数为:"<<fib(n-1)<<endl;
	cout<<"\n"<<endl;
}

结果:
在这里插入图片描述
递归算法就简单介绍到这,希望大家通过此篇文章对递归算法的认识更加深刻。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/baidu_41191295/article/details/111825325