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

📄 00000005.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;0041&nbsp;<BR>发信站:&nbsp;☆清华电机☆&nbsp;(Sat&nbsp;Jul&nbsp;&nbsp;8&nbsp;17:37:54&nbsp;1995)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>第&nbsp;6&nbsp;讲&nbsp;之&nbsp;4&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;(1)&nbsp;<BR>&nbsp;<BR>我们前面提到过,呼叫一个函数,就是把程式的控制权交给函数,&nbsp;<BR>当函数执行完之後,再把控制权交回来。例如:&nbsp;<BR>&nbsp;<BR>void&nbsp;main&nbsp;(void)&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;main()&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;main()&nbsp;start&nbsp;here&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;foo&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;foo()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;main()&nbsp;continue&nbsp;here&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;—┘&nbsp;<BR>void&nbsp;foo&nbsp;(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;↓&nbsp;foo()&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;foo()&nbsp;work&nbsp;here&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└—&nbsp;执行完毕,把控制权还给&nbsp;main()&nbsp;<BR>&nbsp;<BR>那如果我们在函数之中呼叫函数本身呢?例如:&nbsp;<BR>&nbsp;<BR>void&nbsp;foo&nbsp;(void)&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;foo&nbsp;();&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>这时候控制权的流向就会如下:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(第一个)&nbsp;foo()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;呼叫&nbsp;foo(),把控制权交给&nbsp;foo()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(第二个)&nbsp;foo()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;呼叫&nbsp;foo(),把控制权交给&nbsp;foo()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(第三个)&nbsp;foo()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;呼叫&nbsp;foo(),把控制权交给&nbsp;foo()&nbsp;<BR>&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;<BR>&nbsp;<BR>控制权交出去之後就不会回来了,这是一种很危险的动作,其实这就是一种&nbsp;<BR>错误的递回&nbsp;(recursion)。什麽叫做递回呢?递回就是函数直接或间接地叫&nbsp;<BR>用自己。什麽时候我们会用的上递回函数呢?一个常见的例子是求某数的阶&nbsp;<BR>乘:&nbsp;<BR>&nbsp;<BR>int&nbsp;factor&nbsp;(int&nbsp;n)&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(n&nbsp;&lt;&nbsp;0)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;factor&nbsp;(n&nbsp;+&nbsp;1)&nbsp;*&nbsp;n;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(n&nbsp;&gt;&nbsp;0)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;factor&nbsp;(n&nbsp;-&nbsp;1)&nbsp;*&nbsp;n;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else&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;n&nbsp;==&nbsp;0&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;0!&nbsp;=&nbsp;1&nbsp;*/&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>我们知道&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;*&nbsp;(n&nbsp;-&nbsp;1)!&nbsp;if&nbsp;n&nbsp;&gt;&nbsp;0&nbsp;<BR>&nbsp;&nbsp;&nbsp;n!&nbsp;=&nbsp;n&nbsp;*&nbsp;(n&nbsp;+&nbsp;1)!&nbsp;if&nbsp;n&nbsp;&lt;&nbsp;0&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;n&nbsp;=&nbsp;0&nbsp;<BR>&nbsp;<BR>直觉地写成程式就变成了上面&nbsp;factor()&nbsp;这个函数&nbsp;(当然,这个函数在实&nbsp;<BR>际上并不实用,实用的阶乘函数并不容易作出来),这是一个标准的递回&nbsp;<BR>的写法。递回函数有三大要件:起始条件、递回终止条件、递回本体。&nbsp;<BR>在我们上面的例子中,起始条件就是参数&nbsp;n&nbsp;(要求&nbsp;n&nbsp;的阶乘),而递回&nbsp;<BR>终止条件则是&nbsp;n&nbsp;==&nbsp;0&nbsp;(当&nbsp;n&nbsp;=&nbsp;0&nbsp;时传回&nbsp;1,不再继续递回),递回的本&nbsp;<BR>体是&nbsp;factor&nbsp;(n&nbsp;+&nbsp;1)&nbsp;*&nbsp;n&nbsp;及&nbsp;factor&nbsp;(n&nbsp;-&nbsp;1)&nbsp;*&nbsp;n&nbsp;这两个实际呼叫递回&nbsp;<BR>函数的部份。&nbsp;<BR>&nbsp;<BR>我们现在花点时间来&nbsp;trace&nbsp;一下&nbsp;factor&nbsp;(3)&nbsp;的动作:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;呼叫&nbsp;factor&nbsp;(3)&nbsp;<BR>&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;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↓&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;factor&nbsp;(2)&nbsp;*&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;□传回&nbsp;2*3=6,函数结束&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;<BR>&nbsp;&nbsp;&nbsp;□呼叫&nbsp;factor(2)&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;&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;return&nbsp;factor&nbsp;(1)&nbsp;*&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;□传回&nbsp;1*2=2&nbsp;给&nbsp;factor(3)&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;&nbsp;&nbsp;&nbsp;□————————┐&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;□呼叫&nbsp;factor(1)&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;<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;&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;return&nbsp;factor&nbsp;(0)&nbsp;*&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;□传回&nbsp;1*1=1&nbsp;给&nbsp;factor(2)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;□—┐&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;□呼叫&nbsp;factor(0)&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;&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;return&nbsp;1&nbsp;—————┘&nbsp;□传回&nbsp;1&nbsp;给&nbsp;factor(1)&nbsp;<BR>&nbsp;<BR>为什麽我们说终止条件是&nbsp;n&nbsp;==&nbsp;0&nbsp;呢?因为它是递回函数不再继续呼叫&nbsp;<BR>自己的判断条件,所以叫做递回终止条件。每一个递回函数都必须设定&nbsp;<BR>递回终止条件,至於递回终止条件要如何找出来呢?它通常是数学中所&nbsp;<BR>谓的边界条件&nbsp;(boundry&nbsp;condition),只要多多练习大概就能一眼就看&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 + -