递归

定义:自己直接或者间接调用自己
注意: 避免递归次数太多(出现栈溢出)或者死递归
原理:
递归入栈

递归出栈
例:
求n的阶乘

int Fac(int n)
{
 if(n==0 || n==1)
  return 1;
 else
  return Fac(n-1)*n;//(n-1)!
}

最适合用递归的问题
汉诺塔,将n个盘子从a,通过b移到c

void Move(char x,char y)//模拟移动
{
 printf("%c->%c\n",x,y);
}

void Hanoi(int n,char a,char b,char c)
{
 if(n == 1)
  Move(a,c);
 else
 {
  Hanoi(n-1,a,c,b);
  Move(a,c);
  Hanoi(n-1,b,a,c);
 }
}

斐波那契数列是最不适合使用递归编程实现的例子
求第n项的斐波那契数列的值
f(n) = f(n-1) + f(n-2)
1,1,2,3,5,8,13 …
不好用的原因:效率差,从原理可以看出来

int Fibon(int n)
{
 if(n==1 || n==2)
  return 1;
 else
  return Fibon(n-1) + Fibon(n-2);
}

用循环的话就很适合
重点

int Fibon1(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;
 }
 return f3;
}

划重点:
当函数调用次数过多,就避免使用递归,这个时候循环更具有优势,递归是自己直接或间接的调用自己,所以函数中一定会再次出现一个或多个自身函数的使用,即函数中必定会有函数名的再次出现。多数需要考虑(n-1)的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值