函数的递归调用

        在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归(recursive)调用。C和C++允许函数的递归调用。例如:
        int f(int x)
        { int y,z;
          z=f(y);                //在调用函数 f 的过程中,又要调用 f 函数
          return (2*z);
        }
        以上是直接调用本函数。

        可以看出,这种递归调用是无终止的自身调用。显然,程序中不应出现这种无终止的递归调用,而只应出现有限次数的、有终止的递归调用,这可以用 if 语句来控制,只有在某一条件成立时才继续执行递归调用,否则就不再继续。
        包含递归调用的函数称为递归函数。关于递归的概念,有些读者可能感到不好理解,下面用一个日常生活中的例子来说明。
         有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。请问第5个人多少岁?

解题思路:

        显然,这是一个递归问题。要求第5个人的年龄,就必须先知道第4个人的年龄,而第4个人的年龄也不知道。要求第4个人的年龄必须先知道第3个人的年龄,而第3个人的年龄又取决于第2个人的年龄,第2个人的年龄取决于第1个人的年龄。而且每个人都比其前一个人大两岁,即
        age(5)=age(4)+2
        age(4)=age(3)+2
        age(3)=age(2)+2
        age(2)=age(1)+2
        age(1)=10
可以用函数表述如下:
        age(n)=10                       (n=1)
        age(n)=age(n-1)+2        (n>1)

        可以看到,当n>1时,求第n个人的年龄的公式是相同的。

        求解可分成两个阶段:第1阶段是回溯,即将第n个人的年龄表示为第(n-1)个人年龄的函数,而第(n-1)个人的年龄仍然不知道,还要回溯到第(n-2)个人的年龄……直到第1个人的年龄。此时age(1)已知,不必再向前推了。然后开始第2阶段,采用递推方法,从第1个人的已知年龄推算出第2个人的年龄(12岁),从第2个人的年龄推算出第3个人的年龄(14)……一直推算出第5个人的年龄(18岁)为止。也就是说,一个递归的问题可以分为回溯和递推两个阶段。要经历许多步才能求出最后的值。显而易见,如果要求递归过程不是无限制进行下去,必须具有一个结束递归过程的条件。例如 age(1)= 10,就是使递归结束的条件。

编写程序:

运行结果:

程序分析:

        用一个age函数来实现递归过程。main函数中除了return语句外,只有一个cout语句。整个问题的求解全靠一个函数调用"age(5)"来解决。age函数共被调用5次,即age(5),age(4),age(3),age(2),age(1)。其中,age(5)是main函数调用的,其余4次是在age函数中调用的,即递归调用4次。请读者仔细分析调用的过程。应当强调说明的是:在某一次调用age函数时并不是立即得到age(n)的值,而是一次又一次地进行递归调用,到age(1)时才有确定的值,然后再递推出age(2),age(3),age(4),age(5)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值