标题:一个递归调用与返回值的问题,有难度
取消只看楼主
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
 问题点数:0 回复次数:7 
一个递归调用与返回值的问题,有难度

程序如下:
#include<iostream.h>
class A
{
int i;
public:
A(){i=0;cout<<"Default Called!\n";}

A(int x){i=x;cout<<"Constructor Called!\n";}

A(A & t){i=t.i;cout<<"Copy-constructor Called!\n";}

~A(){cout<<"Destructor Called!\n";}

A & operator = (A & t){i=t.i;cout<<"Operator= Called!\n";return *this;}

void display(void){cout<<"$$$$$$$$$$$$$$$\n";cout<<i<<endl;}
};

A fun(A & t, int i)
{
if(i==0)return t;
cout<<endl;
fun(t,--i); //注意,这里没用return;

}

void main()
{
A a(5),b;
int i=3;
cout<<"@@@@@@@@@@@@@@@@\n";
b=fun(a,i);
b.display ();
cout<<"***************\n";
cout<<"End!\n";
}
以下是运行结果:
/*
Constructor Called!
Default Called!
@@@@@@@@@@@@@@@@

Copy-constructor Called!
//出现三个析构函数?????(为什么没有相应的构造函数??)
Destructor Called!
Destructor Called!
Destructor Called!
Operator= Called!
Destructor Called!
$$$$$$$$$$$$$$$
4350224 //结果不正确,若在fun()中添加return就可以得到正确结果,但同样的用法在下面的程序中却能得到正确结果!
***************
End!
Destructor Called!
Destructor Called!
Press any key to continue*/
******************************

类似用法,但参数类型为 int

#include<iostream.h>
int fun(int n)
{
if(n==1)
return n;
fun(n-1);
}
void main()
{

int b;
b=fun(5); //同样没有return!
cout<<b<<endl;
}
结果::
/*
1
Press any key to continue*/

[此贴子已经被作者于2007-5-30 18:10:20编辑过]

搜索更多相关主题的帖子: 返回值 递归 cout 难度 
2007-05-30 18:06
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
以下是引用su11237880在2007-5-30 18:28:05的发言:

有42错的```

貌似大侠,可老兄你倒是说明白点啊!

2007-05-31 11:50
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
回复:(wfpb)int fun(int n){ if(n==1) retur...
不报错,if语句后已经有一个return 了,只有警告。
2007-05-31 17:18
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
是啊,只是警告warning C4715: 'fun' : not all control paths return a value是这样的。但结果是正确的,还有个折半查找的函数也基本上是这么个用法,我也是从那个折半查找的函数开始研究的。
2007-05-31 20:44
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
但是在一定范围内是正确的,关键是有没有人能从递归调用与返回值如何返回的解释一下,比如那个运行时栈的概念
2007-06-01 12:10
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
不能沉了啊
2007-06-01 22:38
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
回复:(wfpb)LZ,个人认为warning C4715: \'fun\' : no...
是啊是啊,我看反汇编只能看个大概,汇编才学了个入门,正在学。我倒是看反汇编代码了,好像当返回类型是int 时,返回值是保存在EAX中的,而其后由于没有再次的return,EAX中一直是没有被改变。
你的意思是从语法才上严格的讲这是不正确的用法??

[此贴子已经被作者于2007-6-2 12:48:24编辑过]

2007-06-02 12:46
youlong699
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-3-30
得分:0 
以下是引用边城路人在2007-6-2 11:30:40的发言:
你可以理解为循环
当满足你的条件是就会结束
栈是运行时开辟的空间
就相当于一个容器
你最好看一下数据结构这本书
栈我是知道的,并且也知道递归可以用栈等效解决,并且编译完成后就是被译成了借助栈的函数调用。但简单的看作循环,把回归看作满足条件跳出循环是不是就不大恰当了啊?
我还有个想法就是,被调用的递归函数的返回值是保存在同一个地方的,每返回一层就根据结果修改一次,所以想到用返回对象做验证观察,结果成了上面的样子,越发解释不清楚了。
2007-06-02 12:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-143602-1-1.html




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

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