📄 subject_20080.htm
字号:
<p>
序号:20080 发表者:秋叶禅 发表日期:2002-11-02 23:59:16
<br>主题:各位,进来看看!递归的问题?
<br>内容:int factorial(int n)<BR>{<BR><BR><BR> if( n == 0 || n == 1)<BR> return 1;<BR> else <BR> {<BR> return n* factorial(--n);<BR> }<BR>}<BR><BR>为什么当n = 3时的它的结果为2?<BR>它最多有两中结果:一为:3*2*1=6;当先执行--n时:它的结果为:2*2*1 = 4;<BR>现在我的计算机却显示为:2;why?<BR>再看看它的过程:<BR>当你等于三时:<BR>到达:3*factorial(2);<BR>而factorial(2) = 2* factorial(1);<BR>factorial(1) = 1;<BR>于是:结果应该为:3*2*1 =6;<BR>我单步执行时:发现:执行到:2*factorial(1);它就返回了!<BR>它并不回到:3*factorial(2)这一步然后返回。为啥?<BR>当n= 4;时函数的返回值等于6。也就是说:它没有返回第一步的递归。<BR>找不到原因?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:*** 回复日期:2002-11-03 00:17:55
<br>内容:1: R == 2 * f(2)<BR>2: f(2) == 1 * f(1)<BR>3: f(1) == 1<BR>R == 2 * 1 * 1 == 2
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:*** 回复日期:2002-11-03 00:29:31
<br>内容:以 n == 3 为例:<BR>15: return factorial(--n) * n ;<BR>0040D40C 8B 4D 08 mov ecx,dword ptr [ebp+8] // ecx = n<BR>0040D40F 83 E9 01 sub ecx,1 // 先减1<BR>0040D412 89 4D 08 mov dword ptr [ebp+8],ecx // n = ecx<BR>0040D415 8B 55 08 mov edx,dword ptr [ebp+8] // edx = n <BR>0040D418 52 push edx // n 压栈<BR>0040D419 E8 EC 3B FF FF call @ILT+5(factorial) (0040100a)<BR>0040D41E 83 C4 04 add esp,4<BR>0040D421 0F AF 45 08 imul eax,dword ptr [ebp+8] // 返回值乘以 n==2 <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:秋叶禅 回复日期:2002-11-03 00:31:10
<br>内容:你的意思就是说:先执行:--n;<BR>于是就变成了:2*factorial(2);<BR>而:factorial(2)就会变成了:1*factory(1);<BR>这我有点明白了!<BR>不过这种行为有点奇怪!有点意外啊!<BR>谢谢!编译器干啥要这样来实现呢!我在看温习数据结构时:<BR>看到这个题目的:书上说:就是当n=3;可能有两种结果!<BR>就是3*2*1和2*2(其实这是错误的)应该为:2*1;<BR>呵呵,被它骗了,谢谢你dr0;
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:*** 回复日期:2002-11-03 00:33:53
<br>内容:至于为何要这样实现,我想编译器作者知道,但是,我不知道,:-)<BR>u are welcome.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:*** 回复日期:2002-11-03 00:37:04
<br>内容:if u wanna your expected result, u can revise it as following:<BR><BR>int factorial(int n)<BR>{<BR> int local;<BR><BR> if( n == 0 || n == 1)<BR> return 1;<BR> else <BR> {<BR> local = n;<BR> return local * factorial(--n);<BR> }<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:大五 回复日期:2002-11-04 11:11:05
<br>内容:编译原理上讲过的--的优先级高于*,所以先--很正常啊!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:秋叶禅 回复日期:2002-11-04 12:30:55
<br>内容:好象他们的优先级是一样的吧!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -