递归的介绍

递归调用是一种特殊的嵌套调用,是某个函数调用自己,而不是另外一个函数。
  递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
  例如:考虑如下计算阶乘的代码:
  long fact(long n)
  {
  if(n==0||n==1) return 1L;
  else return n*fact(n-1);
  }
  这个函数叫做fact,它自己调用自己,这个就是一个典型的递归调用,调用过程类似一个栈。
  注: 主调函数又是被调函数。执行递归函数将反复调用其自身。 每调用一次就进入新的一层。
  int f (int x)
  {
  int y;
  z=f(y);
  return z;
  } 这个函数是一个递归函数。 但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行, 必须在函数内有终止递归调用的手段。常用的办法是加条件判断, 满足某种条件后就不再作递归调用,然后逐层返回。 下面举例说明递归调用的执行过程。
  例2:用递归法计算n!用递归法计算n!可用下述公式表示:
  n!=1 (n=0,1)
  n×(n-1)! (n>1)
  按公式可编程如下:
  long ff(int n)
  {
  long f;
  if(n<0) printf("n<0,input error");
  else if(n==0||n==1) f=1;
  else f=ff(n-1)*n;
  return(f);
  }
  main()
  {
  int n;
  long y;
  printf(" input a inteager number: ");
  scanf("%d",&n);
  y=ff(n);
  printf("%d!=%ld",n,y);
  }
  long ff(int n)
  { ……
  else f=ff(n-1)*n;
  ……
  }
  main()
  { ……
  y=ff(n);
  ……
  }
  程序中给出的函数ff是一个递归函数。主函数调用ff 后即进入函数ff执行,如果n<0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。由于每次递归调用的实参为n-1,即把n-1 的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。下面我们再举例说明该过程。 设执行本程序时输入为5, 即求 5!。在主函数中的调用语句即为y=ff(5),进入ff函数后,由于n=5,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)。 逐次递归展开如图5.3所示。进行四次递归调用后,ff函数形参取得的值变为1,故不再继续递归调用而开始逐层返回主调函数。ff(1)的函数返回值为1,ff(2)的返回值为1*2=2,ff(3)的返回值为2*3=6,ff(4) 的返回值为6*4=24,最后返回值ff(5)为24*5=120。
  JAVA写的递归调用
  public class TestDg {
  public static void main(String[] args) {
  System.out.println(method(5));
  }
  public static int method(int n) {
  if (n == 1)
  return 1;
  else
  return n * method(n - 1);
  }
  }
  汉诺塔------软件递归调用里面最经典的一个案例
  #include<stdio.h>
  int c=0; /* 全局变量,搬动次数 */
  void move(char x,int n,char z)
  { /* 第n个圆盘从塔座x搬到塔座z */
  printf("第%i步: 将%i号盘从%c移到%c/n",++c,n,x,z);
  }
  void hanoi(int n,char x,char y,char z)
  { /* 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘 */
  /* 按规则搬到塔座z上。y可用作辅助塔座 */
  if(n==1)
  move(x,1,z); /* 将编号为1的圆盘从x移到z */
  else
  {
  hanoi(n-1,x,z,y); /* 将x上编号为1至n-1的圆盘移到y,z作辅助塔 */
  move(x,n,z); /* 将编号为n的圆盘从x移到z */
  hanoi(n-1,y,x,z); /* 将y上编号为1至n-1的圆盘移到z,x作辅助塔 */
  }
  }
  void main()
  {
  int n;
  printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:");
  scanf("%d",&n);
  hanoi(n,'a','b','c');
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值