【c++入门(2)】递归

本文介绍了C++中递归的概念,通过实例讲解了如何使用递归求解阶乘问题,并探讨了递归的基本要素:递归公式和递归出口。此外,还提到了递归在斐波那契数列中的应用,强调了“早归”的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个应该放在前面上的,只不过一cha忘了,今天我们把递归学习完。
递归和递推名字很像,很多递归的入门题都可以用递推AC,但是递归也是一种很多问题的解法,是必不可少的一个知识点,话不多说,直接如题。
【基础问题】
n的阶乘可表示为 n! =123*……(n-1)n,1! = 1。例如3的阶乘3!=123 =6。输入一个整数n(n<=15);
输出n的阶乘。
解题思路:
设:n的阶乘为f(n),观察可知f(n) = n * f(n-1)
我们用递推先来解一下:

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <list>
#include <limits.h>

using namespace std;

long long f[N]; 

int main()
{


	int num;
	cin >> num;
	f[1] = 1;
	for (int i = 2; i <= num; i++)
	{
		f[i] = i * f[i - 1];
	}
	cout << f[num] << endl;


    return 0;
}

先把递推的写法先放在这,等会我们再看这个递归是在怎么一步步得到答案的:

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <list>
#include <limits.h>

using namespace std;

int f(int n);

int main()
{


	int num;
	cin >> num;
	cout << f(num) << endl;


    return 0;
}
int f(int n)
{
	if (n == 1) return 1;
	else return n * f(n - 1);
}

这个是上面的阶乘递归程序的示意图:
在这里插入图片描述
在这里插入图片描述
递归公式就是“递”的过程
递归边界就是“归”的实现
但是要注意“归”要先执行,不然就会运行了递归公式以后再“归”这是我们已经与正确答案擦肩而过了。
我们再写一道题,他是递推的经典题,也是递归的经典题——斐波那契数列。

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <list>
#include <limits.h>

using namespace std;

int Fib(int n);

int main()
{


	int num;
	cin >> num;
	cout << Fib(num) << endl;


    return 0;
}
int Fib(int n)
{
	if (n <= 2) return 1;
	return Fib(n - 1) + Fib(n - 2);
}

总结一下递归:
什么是递归: 一个函数在定义过程中,直接或间接的调用自身称为递归.其中直接调用自己称为直接递归,而
a调
用b,b又调用a的递归称为间接递归
递归算法的特点: 递归问题必须可以分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决。
为什么要递归 :解决一个大问题的时候会依赖到和大问题相同的小问题。问题类型一样,规模变小。
递归不能无限地进行下去,否则程序会陷入死循环。
递归的2个基本要素 :
① 递归公式:确定递归的方式,即原问题是如何分解为子问题的?
② 递归出口(边界):确定递归到何时终止,即递归的结束条件?

递归你只要记住要“早归”和算出正确的递归公式基本上就没什么问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

{∞}

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

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

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

打赏作者

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

抵扣说明:

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

余额充值