递归(英语:Recursion),在数学和计算机科学中是指在函数的定义中使用函数自身的方法,在计算机科学中还额外指一种通过重复将问题分解为同类的子问题而解决问题的方法。--oi-wiki
通常来说就是函数调用自己。
样例分析 : 请使用递归计算 \(n!\) \((n \ge 0)\)。
首先我们知道 :
\[n! = \begin{cases} 1 (n=0)\\ n*(n-1)* (n-2) \cdots * 1 (n>0) \end{cases} \]那么我们就容易发现 :
\[n! = n*(n-1)! \] \[n! = n*(n-1)*(n-2)! \] \[n! = n*(n-1)*(n-2)*(n-3)! \] \[\cdots \] \[n! = n*(n-1)*(n-2)*(n-3) \cdots *1! \]而到了 \(1!\) 后,我们把问题缩小到了一个已知情况。
那我们来试着写一下代码 :
int factorial(int n)
{
if(n==0 || n==1) {
return 1;
} else {
return n*factorial(n-1);
}
}
由刚才那个问题我们可以得出结论,递归的过程有以下两个阶段 :
- 将原问题逐步分解成新的子问题,规模逐步减小。
- 达到已知目的,直接求解。
注意:如果无限的递归调用,那就死循环了,没有意义。(所以一定要写出口)
然后我们再来写下经典的求斐波那契数列 :
\[f(n) = \begin{cases} 1 (n=1,2)\\ f(n-2)+f(n-1) (n>2) \end{cases} \]code:
#include<bits/stdc++.h>
using namespace std;
int Fibonacci(int n)
{
if(n==1 || n==2) return 1;
if(n>2) return Fibonacci(n-2)+Fibonacci(n-1);
}
int main()
{
int a;
cin>>a;
cout<<Fibonacci(a);
return 0;
}
但如果你输入一个比较大的数,你会发现你的电脑风扇狂转,半天出不来结果。