| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 599 人关注过本帖
标题:递归调用原理不懂?求高手解答
只看楼主 加入收藏
孤独一生
Rank: 2
来 自:四川达县
等 级:论坛游民
帖 子:45
专家分:55
注 册:2013-4-1
结帖率:56.25%
收藏
已结贴  问题点数:20 回复次数:4 
递归调用原理不懂?求高手解答
#include<stdio.h>
age(int n)/*这是这个函数调用原理不懂每次到这里我就掐壳了*/
{
    int c;
     if (n == 1)
        c = 10;
    else
        c = age(n - 1) + 2;/*这里是怎么执行的*/
        printf("%d\n",c);
    return (c);
}

int main()
{
    printf("%d", age(5));
}
搜索更多相关主题的帖子: return 
2014-12-29 00:41
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
收藏
得分:5 
要理解递归,关键是弄清楚函数中所声明的变量是如何存储的,有参函数的变量包括:传入的实参和内部声明的变量。就你这个例子来说就是参数n和变量c。
这里假设 n = 3 ,代入运行,它的变量存储如下:(不会表格不会图片,一行代表一个函数的变量存储形式)
第一次调用函数,n = 3,内存形式如下:
……
n = 3 : c = age(2) + 2
其它函数的变量

第二次调用函数:
……
n = 2 : c = age(1) + 2
n = 3 : c = age(2) + 2 -- 第一次函数调用后的变量存储位置
其它函数变量

第三次调用函数:(同时也是第一次返回)
……
n = 1 : c = 10 -- n = 1,函数第一次返回,返回至 c = age(n - 1) + 2 的下一句开始执行,也就是打印输出 c 的值,同时函数返回值为 c 的值,也就是age(1) = 10
n = 2 : c (未赋值)-- 第二次函数调用后的变量存储位置
n = 3 : c (未赋值)-- 第一次函数调用后的变量存储位置
其它函数变量

函数第二次返回:
……
n = 2 : c = age(1) + 2 -- 第二次返回,c = 12,也就是age(2) = 12
n = 3 : c = age(2) + 2-- 第一次函数调用后的变量存储位置
其它函数变量

函数第三次返回:
……
n = 3 : c = age(2) + 2-- 第三次返回,c = 14,age(3) = 14
其它函数变量

所以 age( 3 ) 的输出结果应该是:
10
12
14

就你这个代码来说,输出结果应该是:
10
12
14
16
18
18 - 这个结果是 main()函数中的 printf 语句输出的结果

[qq]949654600[/qq]
2014-12-29 09:52
comewest
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:74
专家分:335
注 册:2014-12-3
收藏
得分:5 
公式:   
    age(n)=age(n-1)+2;  n>1      (这是递归公式)
    age(n)=10           n==1     (递归的终点)

过程:
    逐层调用,逐层返回。
实例分析:
以n=5为例,
age(5)=age(4)+2  age(4)=age(3)+2    age(3)=age(2)+2    age(2)=age(1)+2    age(1)=10  (从左向右看,逐层调用,到递归终点再逐层返回如下行所示。)
age(5)=16+2=18   age(4)=14+2=16     age(3)=12+2=14     age(2)=10+2=12    (从右向左看,逐层返回)
2014-12-29 13:56
我只是个学生
Rank: 3Rank: 3
来 自:中石大
等 级:论坛游侠
威 望:1
帖 子:57
专家分:190
注 册:2014-12-14
收藏
得分:5 
二楼有耐心!是个好学生。

我们的善良将助长一个孩子不劳而获的懒惰心理
2014-12-29 14:53
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:5 
也在学习递归
附上练习的一段代码

程序代码:
/* 不使用string.h 反转字符串*/
#include <stdio.h>

/* 计算字符串长度 */
int strLen(char *p) {
    int len = 0;

    while(*(p + len) != '\0') {
        len++;
    }

    return len;
}

/* 循环反转交换值 */
void reverse(char *p, int len) {
    char t;
    int i = 0;

    while(--len > i) {
        t = *(p + i);
        *(p + i) = *(p + len);
        *(p + len) = t;
        i++;
    }
}

/* 递归反转交换值 */
void foo(char *p, int len) {
    char t, *pt = p;

    if(--len > 0) {
        t = *pt;
        *pt = *(pt + len);
        *(pt + len) = t;
        foo(++pt, --len);
    }
}

/* 直接反转打印不交换值 */
void revprt(char *p, int len) {
    while(--len >= 0) {
        printf("%c", *(p + len));
    }
    printf("\n");
}

int main(void) {
    char str[] = "ASCII_string: abcde\n1 2 3 4 5";
    int len = strLen(str);
    puts(str);
    reverse(str, len);
    puts(str);
    foo(str, len);
    puts(str);
    revprt(str, len);
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2014-12-30 20:30
快速回复:递归调用原理不懂?求高手解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017342 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved