函数递归
什么叫递归
递归是一种解决问题的方法,在c语言中,递归就是函数自己调用自己
递归思想
递归的思考方式就是把大事化小,递是递推,归是回归
递归的限制条件
递归存在限制条件,当满足条件时,递归便不再继续
每次递归调用之后,都会越来越接近限制条件
递归举例
1.求n的阶乘
n!=n*(n-1)!
int Fact()
{
if(n==0)
return 1;
eles
return n*Fact(n-1);
}
2.打印一个正数的每一位
输入一个整数,依次打印这个整数的每一位
输入:1234 打印:1 2 3 4
void Print(int n)
{
if(n>9)
Print(n/10);
printf("%d",n%10);
}
int nain()
{
int n = 0;
scanf("%d",&n);
Printf(n);
return 0;
}
3.青蛙跳台阶
青蛙每次能跳1或2个台阶,跳上n个台阶有几种跳法
跳上n个台阶的跳法可以看成是跳上n-1个台阶的跳法加上跳上n-2个台阶的跳法之和
int Fib(int n)
{
if(n<=3)
return n;
else
return Fib(n-1)+Fib(n-2);
}
4.汉诺塔问题
同样看成是n个盘子,上面有n-1个盘子,以此类推
递归与迭代
如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出的问题,为了避免这种问题,可以采用迭代的发布方式
比如 计算n的阶乘,也可以是产生1~n的数字累计乘在一起
int Fact(int n)
{
int i = 0;
int ret = 1;
for(i=1;i<=n;i++)
{
ret*=i;
}
return ret;
}
int main()
{
int n =0;
scanf("%d",&n);
int r = Fact(n);
return 0;
}
举例求第n个斐波那契数
斐波那契数列 1 1 2 3 5 8……
用递归的思想很容易写出代码
int Fib(int n)
{
if(n<=2)
{
return 1;
}
else
return Fib(n-1)+Fib(n-2);
}
但这种写法有大量的重复计算,效率很低,因此要尝试使用迭代的方法
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a + b;
a = b;
b = c;
//把每次循环数字都往后错一位
n--;//控制该循环的执行次数,当n=3,执行1次
}
return c;
}