递归,就是在运行的过程中调用自己。
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
//栈的大小:使用局部变量,1m:1024*1024
时间复杂度:1.只保留高阶项
例如:{ ++xis=0;}//2条,常数 o(1)
2.不要系数
3.o(1):常数项,和问题规模无关
空间复杂度:实现这个算法的额外辅助空间和问题规模之间的关系
斐波纳契数列是典型的递归案例:
递归关系就是实体自己和自己建立关系。
Fib(0) = 1 [基本情况] Fib(1) = 1 [基本情况] 对所有n > 1的整数:
Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义]
尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。例如:
阶乘(1) = 1 [基本情况] 对所有n > 1的整数:
阶乘(n) = (n * 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的
具体问题举例:
1.
int main(int n) //循环实现
{
int f1=1;int f2=1;int f3=1;
for(int i=2;i<n;i++)
{
f3=f1+f2;
f1=f2;
f2=f3;
}
}
2.
void Hanoi(int n,char a,char b,char c)
{
if(n==1)
{
move(a,b);}
else{
Hanoi(n-1,a,c,b);
3.
int Fibon(int n) //递归实现
{
if(n==1||n==2)
{
return 1;}
else{
return Fibon(n-1)+Fibon(n-2);}
}
如下图所呈现关系:清晰呈现Age 语句的递归实现