C++函数与递归的详解

递归( recursion)就是程序调用自身的编程技巧。递归其作为一个算法在解决问题的用处十分广泛。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

就像这样:

 

 递归的好处:

1、代码更简洁清晰,可读性更好;

递归的劣势:

2、时间和空间消耗比较大;

3、很多计算都是重复的;

4、调用栈可能会溢出。

 

最基本调用递归的题目就是  斐波那且数列 用递归写就是这样:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long dg(long long n) {
 4     if (n == 1 || n == 2)//判断临界条件
 5         return 1;//返回1,因为斐波拉且的第1项和第2项都是1
 6     else
 7         return dg(n - 2) + dg(n - 1);//否则,依据关系式F[n]=F[n-1]+F[n-2](n>=2,F[0]=0,F[1]=1)来讲,用代码写出便是这样。
 8 }
 9 
10 int main() {
11     long long n;
12     cin >> n;
13     long long sum= dg(n);
14     cout<<sum;//标准的输出输入
15     return 0;
16 }

但是,递归的一个重要缺点是调用栈可能会溢出!以上程序在大于30时计算会挤极慢,且在达到最高极限时,还会输出-1,然而,用普通代码写的斐波拉且数列就没有这个问题:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int a=0,b=0,c=1,n;
 6     cin>>n;//输入n
 7     for(int i=1;i<=n-1;i++)
 8     {
 9         a=b;
10         b=c;
11         c=a+b;
12     }
13     cout<<c;
14     return 0;
15 }

使用递归解决题目,就得抓住关系式,就像上面的关系式是

return dg(n - 2) + dg(n - 1)

其他的,也要抓住临界点和关系量

if (n == 1 || n == 2)
    return 1;

接下来,我们实战演练一下,看这道题:

 

 题目来源:12345code.com

首先,抓住临界点:

if (n == 1)
        return 0;
else if (n == 2 || n == 3)
        return 1;

在抓住关系式:

else
        return hec(n - 2) + hec(n - 3);

总程序也很简单了,就是:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3  
 4 int hec(int n) {
 5     if (n == 1)
 6         return 0;
 7     else if (n == 2 || n == 3)
 8         return 1;
 9     else
10         return hec(n - 2) + hec(n - 3);
11 }
12  
13 int main() {
14     int n;
15     cin >> n;
16     cout << hec(n);
17     return 0;
18 }

 

如果你还想了解更多关于递归的知识,你可以收看下面的频道:

C++算法—递归算法_哔哩哔哩_bilibili

C++算法小练习——递归案例_哔哩哔哩_bilibili

《C语言-C++学习指南》 8.8-函数的递归调用_哔哩哔哩_bilibili

C++-递推与递归_哔哩哔哩_bilibili

posted @ 2022-01-19 19:17  冯子坤  阅读(576)  评论(0编辑  收藏  举报