| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 370 人关注过本帖
标题:递归函数返回值的问题
只看楼主 加入收藏
中国电信
Rank: 1
等 级:新手上路
帖 子:16
专家分:9
注 册:2013-10-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
递归函数返回值的问题
前几天写了个哈西表的程序,里面用到的递归。由于是看着书上的算法写的,虽然程序的功能实现了,可关于递归还是有些不懂。然后我回家敲些关于递归函数的程序,发现其中存在好奇妙的关系,下面是我的代码和编译后的截图,希望大神能帮我解答。
程序代码:
#include<stdio.h>
int main()
{
        int digui(int i);
        int i;
        scanf("%d",&i);
        i=digui(i);
        printf("i=%d\n",i);

}
int digui(int i)
{
        int d=0;
        d=i+1;
        printf("d=%d\n",d);
        if(d==10)
        {
                return(d);
        }
        else
        {
                i=digui(d);
        }
//        printf("i=%d    i is address=%d\n",i,&i);          #1
//        return(i);         #2
}

当运行上面的程序时,结果是
图片附件: 游客没有浏览图片的权限,请 登录注册

这个我不大理解的是,在当d=10时,它返回d给上一层的i,可是当执行了“i=digui(d)”后,然后怎么搞呢?是编译器自己默认自己return吗?它把谁的值return呢?(根据编译结果知道是把i的值return是吧,可是问题在后面呢?)
在当我在递归函数后面加上“printf("i=%d    i is address=%d\n",i,&i); ”这句代码时编译结果完全不同了,下面是截图:
图片附件: 游客没有浏览图片的权限,请 登录注册

当d=10时,它返回d给上一层的i,于是执行了“printf("i=%d    i is address=%d\n",i,&i); ”这句代码,结果是i=10,然后就又是上一层的i了,又执行“printf("i=%d    i is address=%d\n",i,&i); ”这句代码,可是结果是i=29。就这样直到栈的清空。为什么会出现这样的结果?多加了一句貌似与程序无关的代码,却使程序的结果发生了重大变化。
最后当我在程序的又加了句“return(i);   ”这样使程序的结果又回到了以前我所预料到的情况。下面是截图:
图片附件: 游客没有浏览图片的权限,请 登录注册

这上面的问题我实在是搞不大懂,希望大神指点一下。
谢谢!!
搜索更多相关主题的帖子: include 
2013-11-23 21:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
这个叫未定义行为?还是啥来着

你这不是自己给自己找麻烦?

真闲啊

你算一算printf的返回值,就应该能明白 图 2的问题了


[fly]存在即是合理[/fly]
2013-11-23 21:56
ljx小子
Rank: 8Rank: 8
来 自:星星
等 级:蝙蝠侠
威 望:2
帖 子:222
专家分:916
注 册:2013-10-7
收藏
得分:10 
函数有return时碰到return结束,没有return时执行到大括号结束,或者碰到exit结束
“可是当执行了“i=digui(d)”后,然后怎么搞呢?是编译器自己默认自己return吗?它把谁的值return呢?(根据编译结果知道是把i的值return是吧,可是问题在后面呢?)”
这个是没有结束又直接调用了函数digui

。。。。。。。。。。。
2013-11-23 23:31
中国电信
Rank: 1
等 级:新手上路
帖 子:16
专家分:9
注 册:2013-10-20
收藏
得分:0 
以下是引用azzbcc在2013-11-23 21:56:01的发言:

这个叫未定义行为?还是啥来着

你这不是自己给自己找麻烦?

真闲啊

你算一算printf的返回值,就应该能明白 图 2的问题了

其实我在发这个贴子的时候就知道这是个程序存在的危险,可是c/c++却支持这种程序,我发这个帖子只是想高人给我指点一下关于这样的问题,其中机器中栈的数据是怎么变化的。
2013-11-24 13:51
快速回复:递归函数返回值的问题
数据加载中...
 
   



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

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