⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_20080.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:20080 发表者:秋叶禅 发表日期:2002-11-02 23:59:16
<br>主题:各位,进来看看!递归的问题?
<br>内容:int factorial(int n)<BR>{<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if( n == 0 || n == 1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return n* factorial(--n);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<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:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return factorial(--n) * n ;<BR>0040D40C 8B 4D 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,dword ptr [ebp+8] // ecx = n<BR>0040D40F 83 E9 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,1 // 先减1<BR>0040D412 89 4D 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+8],ecx // n = ecx<BR>0040D415 8B 55 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [ebp+8] // edx = n <BR>0040D418 52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx // n 压栈<BR>0040D419 E8 EC 3B FF FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ILT+5(factorial) (0040100a)<BR>0040D41E 83 C4 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,4<BR>0040D421 0F AF 45 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;int local;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if( n == 0 || n == 1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local = n;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return local * factorial(--n);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<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 + -