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

📄 00000006.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;<A HREF="mailto:ax.bbs@bbs.ee.nthu.edu.tw.">ax.bbs@bbs.ee.nthu.edu.tw.</A>&nbsp;(athena),&nbsp;信区:&nbsp;test&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;星星流讲座&nbsp;0042&nbsp;<BR>发信站:&nbsp;☆清华电机☆&nbsp;(Tue&nbsp;Jul&nbsp;18&nbsp;22:54:26&nbsp;1995)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>第&nbsp;6&nbsp;讲&nbsp;之&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Topic:&nbsp;Recursion&nbsp;(2)&nbsp;<BR>&nbsp;<BR>前头我们讲了什麽叫做递回,我们现在来研究一下递回的优缺点:&nbsp;<BR>&nbsp;<BR>递回的优点:某些问题是以递回的方式定义的,以递回函数来制作&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;会比较简洁易懂,程式写作的时间也可以缩短。&nbsp;<BR>递回的缺点:递回函数花费了太多的能量,执行起来通常较非递回&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的版本为慢。&nbsp;<BR>&nbsp;<BR>在此我们解释一下「能量」的意义:以硬体的观念来讲,函数是放&nbsp;<BR>在记忆体中的一群指令,而每个函数被放置在不同的记忆体,如下&nbsp;<BR>图所示:&nbsp;<BR>&nbsp;<BR>&nbsp;┌——————————————————————————————┐&nbsp;<BR>&nbsp;│&nbsp;&nbsp;┌—————————————————————————┐&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;│IP□&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;(text)&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┌———┐&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┌————┐&nbsp;&nbsp;&nbsp;&nbsp;┌————┐&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│main()│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│函数&nbsp;A()│&nbsp;&nbsp;&nbsp;&nbsp;│函数&nbsp;B()│&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└———┘&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└————┘&nbsp;&nbsp;&nbsp;&nbsp;└————┘&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;└—————————————————————————┘&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┌————————┐┌———┐┌—————————┐&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;&nbsp;data&nbsp;heap&nbsp;&nbsp;&nbsp;&nbsp;││stack&nbsp;││global&nbsp;name&nbsp;space&nbsp;│&nbsp;│&nbsp;<BR>&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└————————┘└———┘└—————————┘&nbsp;│&nbsp;<BR>&nbsp;└——————————————————————————————┘&nbsp;<BR>&nbsp;<BR>所有的程式码都被放置在&nbsp;code&nbsp;这块记忆体里,也只有程式码才可以放在&nbsp;<BR>code&nbsp;中,我们也常把&nbsp;code&nbsp;这块记忆体叫做&nbsp;text,意即程式的本文之意&nbsp;<BR>。所有的区域变数都被放在&nbsp;data&nbsp;heap&nbsp;这块记忆体中。stack&nbsp;这&nbsp;<BR>块记忆体是给编译程式和作业系统应用的,我们通常无法直接取用。所有&nbsp;<BR>的静态变数、全域变数以及外部变数都被放在&nbsp;global&nbsp;name&nbsp;space&nbsp;中,&nbsp;<BR>在&nbsp;UNIX&nbsp;系统下这块记忆体也叫做&nbsp;bss。一个程式要占据多大的记忆体,&nbsp;<BR>在&nbsp;UNIX&nbsp;系统下可以用&nbsp;size&nbsp;这个指令看出来,例如我们想看看&nbsp;gcc&nbsp;占了&nbsp;<BR>多大的记忆体空间:&nbsp;<BR>&nbsp;<BR>[thccy14]/usr/local/bin&gt;&nbsp;size&nbsp;gcc&nbsp;<BR>text&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;bss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filename&nbsp;<BR>57312&nbsp;&nbsp;&nbsp;8192&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;65504&nbsp;&nbsp;&nbsp;ffe0&nbsp;&nbsp;&nbsp;&nbsp;gcc&nbsp;<BR>&nbsp;<BR>可以看到&nbsp;gcc&nbsp;的&nbsp;code&nbsp;有&nbsp;57312&nbsp;bytes&nbsp;大,需要&nbsp;8192&nbsp;bytes&nbsp;的&nbsp;data&nbsp;<BR>heap,不需要&nbsp;bss。&nbsp;<BR>&nbsp;<BR>那麽程式是怎麽被执行的呢?首先,有一个叫做&nbsp;IP&nbsp;的暂存器会指向程式&nbsp;<BR>开始的地方(通常是&nbsp;main&nbsp;函数),IP&nbsp;的意思就是&nbsp;Instruction&nbsp;Pointer,&nbsp;<BR>CPU&nbsp;会依序执行&nbsp;IP&nbsp;所指位址的指令。&nbsp;<BR>&nbsp;<BR>当函数呼叫发生的时候,硬体必须经过下列的流程才能转移控制权:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数呼叫发生&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把目前的程式执行状态存进&nbsp;stack&nbsp;(含&nbsp;IP)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把函数的参数由右而左存进&nbsp;stack&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把&nbsp;IP&nbsp;指向欲前往的函数&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前往函数&nbsp;<BR>&nbsp;<BR>进入函数之後,函数由&nbsp;stack&nbsp;取得参数&nbsp;(这部份的码由编译器自动产生)&nbsp;<BR>之後,开始执行,执行完毕时依以下的流程交回控制权:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数结束&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将传回值存入&nbsp;stack&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;取出&nbsp;stack&nbsp;中原程式执行状态&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;恢复原程式执行状态&nbsp;(不含&nbsp;IP)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;取出传回值&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存回原来的&nbsp;IP&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续执行原来的程式&nbsp;<BR>&nbsp;<BR>我们每呼叫函数一次,都必须做这些动作,也就是&nbsp;CPU&nbsp;必须浪费很多时间&nbsp;<BR>来处理这些记忆体的储存和更新,会使程式的速度变慢,所以我们说递回&nbsp;<BR>函数花费了太多的能量,因为递回函数就是不断地执行函数的呼叫。&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>本文原作者为徐振家,原作刊载於星星神教总坛&nbsp;☆清华电机☆&nbsp;test&nbsp;板。&nbsp;<BR>你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。&nbsp;<BR>原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。&nbsp;<BR>未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。&nbsp;<BR>其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。&nbsp;<BR>对本文有任何疑问或意见请&nbsp;mail&nbsp;给&nbsp;<A HREF="mailto:ax.bbs@bbs.ee.nthu.edu.tw,谢谢。">ax.bbs@bbs.ee.nthu.edu.tw,谢谢。</A>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -