函数的递归调用二

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

int f(int x)
       {int y,z;
z=f(y);
return2*z);
        }

在调用函数f的过程中,又要调用f函数,这是直接调用本函数。

有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大。
显然,这是一个递归问题。要求第5个人的年龄,就必须先知道第4个人的年龄,而第4个人的年龄也不知道,要求第4个人的年龄必须先知道第3个人的年龄,而第3个人的年龄又取决于第2个人的年龄,第2个人的年龄取决于第1个人的年龄。而且每一个人的年龄都比其前1个人的年龄大2。
即 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-1)+2   (n>1)
可以看到,当n>1时,求第n个人的年龄的公式是相同的。因此可以用一个函数表示上述关系。
求解可分成两个阶段:第一阶段是“回推”,即将第n个人的年龄表示为第(n-1)个人年龄的函数,而第(n-1)个人的年龄仍然不知道,还要“回推”到第(n-2)个人的年龄……直到第1个人年龄。此时age(1)已知,不必再向前推了。
然后开始第二阶段,采用递推方法,从第1个人的已知年龄推算出第2个人的年龄(12岁),从第2个人的年龄推算出第3个人的年龄(14岁)……一直推算出第5个人的年龄(18岁)为止。也就是说,一个递归的问题可以分为“回推”和“递推”两个阶段。要经历许多步才能求出最后的值。显而易见,如果要求递归过程不是无限制进行下去,必须具有一个结束递归过程的条件。例如,age(1)=10,就是使递归结束的条件。

#include <stdio.h>
int age (int n);
void main()
{
    printf("%d\n",age(5));
}
int age (int n)
{
    int c;
    if(n==1) 
        c=10;
    else
        c=age(n-1)+2;
    return(c);
}

求n!··也可以用递归方法,即5!等于4!×5,而4!=3!×4…1!=1。可用下面的递归公式表示:
n!=1(n=0,1)
n·(n-1)!(n>1)

#include <stdio.h>
int f(int n)
{
    if(n<0)
    {
        printf("n<0,error");
        return -1;
    }
    else
        if(n==0||n==1)
            return 1;
        else
            return f(n-1)*n;
}
void main()
{
    int num;float y;
    printf("please input num\n");
    scanf("%d",&num);
    y=f(num);
    printf("result=%.2f",y);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值