我们都知道,函数可以被其他调用,但还有一种情况,也就是函数自己调用自己,这就是递归。递归思想是将一个复杂的问题划分成为一个或多个相似的简单子问题来求解的过程。举个例子,数学中的通过降次解决高次计算的方法,就和递归思想相关联;
如:求解,已知
=5;
=
;
=
;
=
;
此时x已知,我们便可以返回计算。
=5
5=25;
=25
5=125;
=125
5=625;
从而得解:=625。
一般来说,用递归解决问题之前还需四步操作:
1.定义问题的状态;
2.划分相似的简单子问题(上文的“
=![x^{3}](https://latex.csdn.net/eq?x%5E%7B3%7D)
![\times](https://latex.csdn.net/eq?%5Ctimes)
;
=![x^{2}](https://latex.csdn.net/eq?x%5E%7B2%7D)
![\times](https://latex.csdn.net/eq?%5Ctimes)
;
=![x^{}](https://latex.csdn.net/eq?x%5E%7B%7D)
![\times](https://latex.csdn.net/eq?%5Ctimes)
”就是这步);
3.找到递归的边界;
4.找到递归的关系;
光说可不行,下面是一道经典简单例题:
洛谷P5739 【深基7.例7】计算阶乘 题目作者:深入浅出
题目描述
求 n!,也就是 12
3
4
······
n。
挑战:尝试不使用循环语句(for、while)完成这个任务。
输入格式
第一行输入一个正整数 n。
输出格式
输出一个正整数,表示 n!。
样例
样例输入
3
样例输出
6
提示
数据保证,1<= n<=12。
解题:
我们首先定义此问题的状态,即用f(n)表示n的阶乘;
然后划分相似的简单子问题,即f(n)=f(n-1)*n;
再找到递归的边界,即当n=1时,f(n)=1;
最后找到递归的关系,即当n=1时,f(n) = 1 ,当n>1时,f(n)=f(n-1)*n;
(定义函数)
在主函数中声明输入n,引用我们创建的f()函数,即可完成;
代码如下:
(原创不易,关注点个赞再走吧)
#include<bits/stdc++.h>
using namespace std;
int f(int n){
if(n==1){
return 1;
}else{
return f(n-1)*n;
}
}
int main(){
int a;
cin>>a;
cout<<f(a);
return 0;
}