| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1811 人关注过本帖
标题:考试题目,不理解为什么会得出这样得结果
只看楼主 加入收藏
overflows
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2020-11-29
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
考试题目,不理解为什么会得出这样得结果
#include<stdio.h>
static s_age = 1;
int age(int n)
{
    int c = 0;
    if (1 == n)
    {
        c = 10;
    }
    else
    {
        c = age(n - 1) + s_age;
    }
    s_age++;
    return c;
}
int main ( )
{
    s_age++;
    printf("%dn", age(5));
    return 0;
}
为什么这段代码会输出28而不是24
搜索更多相关主题的帖子: age 试题 return 结果 int 
2020-12-23 21:49
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
这个递归,过程复杂,理解起来很讨厌的。
如果不明白,建议你把主函数中的age()的参数分别改成1,2,3,4,5。运行程序,逐步理解吧。
2020-12-23 22:16
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:10 
回复 楼主 overflows
你是只看到程序,没看到问题吧?我将问题发出来,你就好理解了:

   有5个人坐在一起,问第五个人多少岁?他说比第4个人大6岁。问第4个人岁数,他说比第3个人大5岁。问第三个人,又说比第2人大4岁。问第2个人,说比第一个人大3岁。最后问第一个人,他说是10岁。请问第五个人多大?

[此贴子已经被作者于2020-12-25 19:01编辑过]

收到的鲜花
  • overflows2020-12-29 20:13 送鲜花  1朵   附言:又理解了一点
  • nosnoy2020-12-30 16:51 送鲜花  1朵   附言:优秀的解释
2020-12-23 23:21
zf1801305383
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-12-19
收藏
得分:0 
s_age定义的全局静态变量,在主函数加1之后是2,每次递归之后,s_age都加1,第一次结束之后是3,然后4,5,6。所以有这个结果,你直接定义s_age=2,不用那些自增就好了
2020-12-25 16:23
洪荒
Rank: 1
等 级:新手上路
帖 子:6
专家分:5
注 册:2020-12-25
收藏
得分:5 
我来单从代码本身的角度,来回带楼主,理顺这段代码的关键是理顺隐含嵌套代码的执行顺序
下面是c面对age(5)时的内心想法:
由下往上看是代码由外向内的嵌套顺序,由上向下看是运算顺序
c=10,s_age=3

c=age(1)+s_age,s_age++

c=age(2)+s_age,s_age++

c=age(3)+s_age,s_age++

c=age(4)+s_age

age(5)
------
3+1+1+1=6

c=10
age2:c=10+3
13+4
17+5
22+6=28
收到的鲜花
  • overflows2020-12-29 20:11 送鲜花  1朵   附言:谢谢
2020-12-25 20:27
洪荒
Rank: 1
等 级:新手上路
帖 子:6
专家分:5
注 册:2020-12-25
收藏
得分:0 
回复 2楼 zbjzbj
看我的回复怎么样
2020-12-25 20:31
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:5 
递归有个出口,看递归就是要看出口,出口是递归的终结点      
    出口找到了,就逆推。这题的出口是n==1  那就找n==1时的结果。此时
     c==10   s_age是静态全局变量,作用域是整个程序范围,调用函数之前
它就自加1,它原本值就是1,所以到了c==10时,它就是2了。
    到这里就可以知道age(1)的返回结果和副作用是什么了
     它返回10,副作用就是s_age的值是多少,是3
     而如何看age(2)
     看代码
int age(2)   
{
    int c = 0;
    if (1 == n)
    {
        c = 10;
    }
    else
    {
        c = age(1) + s_age;/*    上面已经讨论了age(1) ==10,s_age==3*/
    }
    s_age++;   /*这个自加后,s_age==4*/
    return c;    /*是10+3==13*/   所以age(2)的返回值是13,S_age是4
}
   同理可推理age(3,4,5)

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-26 10:47
overflows
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2020-11-29
收藏
得分:0 
回复 3楼 风过无痕1989
懂了
2020-12-29 20:08
overflows
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2020-11-29
收藏
得分:0 
回复 7楼 do8do8do8
感谢啦,懂了很多
2020-12-29 20:15
快速回复:考试题目,不理解为什么会得出这样得结果
数据加载中...
 
   



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

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