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 }
如果你还想了解更多关于递归的知识,你可以收看下面的频道:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)