1。递归的本质i就是自己调用自己,这个过程说来简单,但是实际操作起来很是困难
2.递归应该注意的问题。
(1)什么时候开始?
(2)什么时候结束?
(3)递归的过程。
只要明了这三点,递归就很简单了。
另一个说法是:有去有回。
例子:
//求1-100的和
int add(int i)
{
if(i==1)
return i;//结束
else
return fun(100-i)+i;//过程
}
int main()
{
printf("%d\n",fun(100));//开始
return 0;
}
这个递归计很简单。
当fun函数开始被调用的时候,i=100;
当i!=1的时候,调用过程是父fun(100-i)+i,这也是“去”的过程
当i=1时,fun(1)=1
解析如下:
i=100,fun(100)=fun(99)+100
i=99,fun(99)=fun(98)+99
...........................
i=2,fun(2)=fun(1)+2
i=1,fun(1)=1
这是整个“递”的过程,
回的过程是将值一层一层往回带入,这是“归”的过程。
例题1:
求10!
10!=10*9*8*7*6*5*4*3*2*1;
#include<stdio.h>
int fun(int i)
{
if(i==1)
return i;
else
fun(10-i)*i
}
int main()
{
printf("%d\n",fun(10));
}
例题2
求阶乘之和
fun(5)=5!+4!+3!+2!+1!
#include<stdio.h>
int fun(int i)
{
if(i==5)
return i;
else
return fun(i+1)*i+i;
}
int main()
{
printf("%d\n",fun(1));
return 0;
}
求斐波拉契数列
1,1,2,3,5,8,13,21,33,54
fun(n)=fun(n-1)+fun(n+1)
#include<stdio.h>
int fun(int i)
{
if(i==1||i==2)
return i;
else
return fun(n-1)+fun(n-2)
}
int main()
{
printf("%d\n",fun(10));
}