函数递归调用(c语言为例)

函数递归调用(c语言为例)1.定义:在调用一个函数的过程中又出现直接或间接调用该函数本身,

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

int fun(int x){
    return fun(x+2);//在执行f函数的过程中又要调用f函数
}

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

函数递归调用(c语言为例)函数递归调用(c语言为例)函数递归调用(c语言为例)函数递归调用(c语言为例)

函数递归调用(c语言为例)

                        图 1

    如果在调用f1函数过程中要调用f2函数,而在调用f2函数的过程中又要调用f1函数,就是间接调用本函数,见图2

函数递归调用(c语言为例)函数递归调用(c语言为例)函数递归调用(c语言为例)函数递归调用(c语言为例)

                        图2

    不过图1与图2这两种递归调用都是无终止的自身调用。显然程序中不应该出现这种无终止的自身调用,而只应出现有限次数、有终止的递归调用,这可以通过if语句来控制,只有在某一条件成立时才继续执行递归调用;否则就不再继续。

    关于递归的概念,有些初学者感到不好理解,下面举一谭浩强老师的《c程序设计(第四版)》中的例子说明:

例一:有5个学生在一起,问第五个学生多少岁,他说他比第四个学生大2岁;问第四个学生多少岁,他说比第三个学生大2岁……最后问第一个学生,他说是10岁。请问第5个学生多大。

思路1:顺序法age1 = 10;age2 = age1 + 2; …; age5 = age4 + 2;则可以通过for循环解决问题:

void main() {
     int age[5] = {0}; age[0] = 10;
     for(int i = 0; i < 4 ;i++) {
         age[i + 1] = age [i] + 2;
     }
     printf("the fifth student’sage is %d\n", age[4]);
}

思路2:要求第5个学生的年龄,就必须先知道第四个学生的年龄,而第四个学生的年龄也不知道,要求第四个学生的年龄必须知道第三个学生的年龄,而第3个学生的年龄又取决于第二个学生的年龄,第二个学生的年龄取决于第一个学生的年龄。而每一个学生的年龄都比其前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)= age(n-1) + 2(n > 1)

    可以看到,当n >1时,求第n个学生的年龄的公式是相同的。因此可以用一个函数表示上述关系。图3表示求第5个学生年龄的过程。

 函数递归调用(c语言为例)函数递归调用(c语言为例)函数递归调用(c语言为例)函数递归调用(c语言为例)

                                                           图3

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

c语言代码如下:

int useRecursiveToGetAge(int n){
    if (n == 1) {
        return 10;
    } else {
        return useRecursiveToGetAge(n - 1) + 2;
    }
}
void main(){
    printf("the fifth student's age is %d\n",useRecursiveToGetAge(5));
}

例二:求n!。

    要回宿舍了,直接上代码。

//思路一:非递归
void noneRecursiveForFactorial() {
    int i, fac = 1;
    printf("please input an Integer which is large than 1\n");
    scanf("%d", &i);
    int temp = i;
    while(i >= 1){
        fac *= i;
	--i;
    }
    printf("the factorial value of %d is %d\n", temp, fac);
}
//思路二:递归
int useRecursiveForFactorial(int i){
    if (i == 1) {
        return 1;
    } else {
        return useRecursiveForFactorial(i - 1) * i; 
    }
}
void main(){
    //noneRecursiveForFactorial();
    int i;
    printf("please input an Integer which is large than 1\n!!!");
    scanf("%d", &i);
    printf(the recursive value of %d is %d\n, i, useRecursiveForFactorial(i));
}

今天的文章函数递归调用(c语言为例)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30311.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注