好 我們剛剛 這個permutation 利用recursive的概念
把他做出來的演算法 在這個地方
接下來我們就把這個概念 把他變成recursive的program
那下面這個就是我們的recursive program
那我們來看看 這個recursive program所談的東西
是做什麼事情呢
這個char *a a是我們存放英文字母的array
k跟m就是我們的範圍
換句話說呢 我們看一下這一行 我們就知道說
這邊的permutation呢 他幫我們做的事情是從a[k]到a[m]
把他做一個permutation
a[k]到a[m]
好 那再下來我們來看看這裡面的內容到底是什麼東西
這個k如果等於m
這個k的值 原來是比較小的
譬如說 如果是以這個為範例的話
這個是 0 1 2 3 所以一開始的時候 k=0
m是等於3
那我們在這個recursive的運算當中
最開始的時候 這個a
就是我們這邊的k 跟你這個m當然還不一樣
表示呢 他還要繼續recursive下去
表示說 我們要把什麼
把這第k個 也就是最前面那個
把他提出來 剩下的要recursive
所以我們先看下面這一段 a[k]到a[m]我們是要怎樣做recursive
我們來看看他是怎麼做recursive的
這個
先看這一個
a[k] 跟 a[i] 作swap 對調
那這個swap在這裡 在我們的課本裡面
他把它視為一個當然的指令
那事實上呢
可能沒有這樣的指令 我們要自己寫program
對調 swap就是對調 exchange
這裡就是exchange的意思 對調
把兩個對調
所以呢 我們就是把a[k]跟a[i]作對調
那這個i是什麼東西
i最開始的值就等於k
所以我們以這個為範例
這i的值最開始是最前面的這個a
最前面這個a
然後呢 這個a跟k對調
所以就是 k跟k對調
k跟k對調的話 其實還是a放在前面
好 所以 我們可以看
最開始的時候是k跟k對調
也就是我們這個範例的這個a
放在最前面的位子
剩下的部分 剩下還有三個
他去做recursive
所以剩下的部分呢 就是什麼
做permuataion
他是從k+1開始到m
所以 我們的k本來是在0的地方
剩下的部分作recursive 剩下的部分從1到3 作recursive
那所以這一段就是 這一段
這一段就是1到3做recursive
好 所以他就是
k+1 到 m 作recursive的運算
這個Permutation就是我們這一個 一樣的
所以他就recursive運算
算完畢之後
他再把那個a調回來原來的位子
所以呢 剛剛是a[k]跟a[i]作對調
現在做完這個recursive之後呢 再把a[k]跟a[i]再調回來
再調一次
再對調一次的話 就把他調回來
那當然你在最開始的這個範例看不出來
這個a跟a對調 還是放在第0個位子
好 下一次
我們再來看一下
下一次 這邊的i的值就會變成 剛剛是k嘛 對不對
下一次這個i的值就會 i+1
所以i的值其實是變成k+1
在我們這裡k+1就是第1個
所以下一次 下一次的recursive是什麼
是a[k]跟a[i] 這個i是k+1了
k+1 在我們這裡是0跟1要對調
0跟1對調
那0跟1對調的話 就這個
就這個範例
這個 這個就對調了
所以第0個跟第1個就對調
然後
第0個跟第1個對調之後呢 剩下這個部分
剩下這個部分 來 一樣
k+1到m k現在還是0 記得
所以就是acd在這邊做recursive
你這兩個對調了 等於是b跑到最前面了
那剩下這個部分呢 在這邊做recursive
recursive完畢之後
下一步 又把a[k]跟a[i]對調
把它恢復原狀
這一部就是把他恢復原狀
所以你可以在你的筆記上面註記一下
這個交換的目的是把他恢復原狀
這個調過去了 做完recursive之後呢 再把它恢復原狀
好 所以這一步當然也是對調的意思 但他的目標是把它恢復原狀
恢復原狀之後呢 又回到abcd的狀態
一樣的 回到abcd的狀態 一樣的
然後 再下一個iteration i=k i又+1了
i = k + 2
k+2就是這個 就是這一個
所以就是什麼
第二個跟第三個對調
也就是 噢不
第二個
k+1跟m對調
不是不是k跟i對調
所以下一次的話就是
0跟2對調 就是這兩個對調
就c 標在這裡
剩下的部分recursive
recursive之後呢 又把他調回原來的樣子 恢復原狀
最後一次
就是a跟d對調 然後呢 又是recursive 然後又恢復原狀
所以呢 這個program完全是把前面的概念把它變成C的recursive概念
那你在這邊做這個對調的時候阿
這邊這個recursive做對調的時候
事實上都還沒到 要把他印出來的階段
什麼時候才要把他印出來
k等於m
好 所以呢 我們就來看一下
什麼叫做k=m 我們來看一下
我們就recursive進去看一下
剛剛這個 最開始是這個a在前面
然後permutation就是k+1 m
所以就這些部分在recursive
這一部分在recursive
那我們看看這些部分在recursive的話
再進去一層
b 然後c d再recursive
再過來 當然你可能把c放在前面
bd再recursive 再過來你把d放在前面
d放在前面 b跟d對調 所以cb再recursive
那我們再看看這一層 他也要recursive
這個recursive他怎麼做的
這個 我們再把它展開來看看
這個就是把c放在前面 d recursive
那他只有一個阿 他只有一個
好 所以當我們recursive到最後面的時候
k等於m
你剩下這個d要recursive的時候
他的k 一開始的k k是開始的 m是結束的
那他只有一次阿 所以k就等於m
所以當你recursive到這一個階段的時候呢
我們就把他印出來
因為你這個下面沒東西 讓你recursive
其實只剩最後一個英文字母他就把他印出來
所以下面這個就把他印出來
那印不是印最後一個英文字母哦
印目前在array裡面 你這個是最後一個字阿
那在array裡面 他的形狀長什麼樣子
那如果你是從這邊來的 這個是從這裡來的
這個是從這邊來的
所以在array裡面就是a b c d
就把他印出來
好 所以呢 這個印的方式 就是i從0開始
到m i從0開始到m 就把他印出來
那後面這個就是把他印出來而已
好 所以 這邊的recursive的概念
最重要的還是前面的這個概念
你這個概念弄通了 那下面這個program你要trace的話就非常容易
好 那下面這邊是一個範例
這邊是一個main program
就是當然我們在recursive的function裡面的話
我們C語言裡面 會有一個main program來呼叫
那這是permutation 送進去的是一個b的array
b的array就是像上面 這邊就是一個b的array
那我們這邊這個b的array
這個b 有設定到十個位子給他
可是呢 我們設定初值的話 從0到6
就是abcdefg 0~6
那我們呼叫的範圍是0到2
這個a是我們進來的charter的array
那k跟m就是我們的範圍
要recursive的範圍
在我們這個範例裡面是0到2
0~2的意思就是abc
a一個 b一個 然後c一個
好 那就是0到2的範圍去recursive
我們剛剛最開始解的 是四個英文字的
這個recursive的 這邊的話是三個英文字的
那最後的在這裡
這裡把他抄一下
好 那這邊的output 你把剛剛的program仔細trace的話
就會得到這一個output
再下來 我們來談一段 就是
我們怎樣說一個program是一個被接受 是一個好的program
你可能在大一的時候寫一些program
你可能在大一的時候 寫寫 然後答案對了就對了
那我們希望你在資料結構裡面 你寫的program是有效率的program
是一個好的program
所以呢 將來各位在交這個program 交到助教這邊去
假設 助教發現你的program 雖然答案是對的
但是一個不好的program 他會把你退回去
當然CPE考試是用電腦判讀的
沒辦法退你這個不好的program
但是呢 我們的助教是人
你的資料結構如果是一個壞的program 助教就把你退回去
什麼叫好的program
這些東西 就是我們未來在寫program的時候要遵循的東西
criteria 就是條件 你把他翻譯成條件好了
規範 其實他是規範、條件
我們怎麼樣判斷一個program的規範是什麼
第一個 雖然這個看起來很無聊 但我們還是要一個一個把他講一下
第一個 這個program是不是達成我們的要求
what we want it to do
達成我們要的要求 這個是最基本的
我們要你做n階層 但你做得不是n階層 那我們就不必談
最基本的
再過來 第二個呢
這個program是不是correctly 就是正確的根據我們原來的
spe spe 我們常常在工作上面說你好好定義spec
spec就是這個字的簡寫 spec
平常我們寫這個spec就這樣寫
spec
未來你在設計program常常會聽到這個字 spec
你的東西 你的spec長什麼樣子
spec就是規範
規定規範 spec
specification spec
是不是按照我們的規範來進行
那我們在給各位的習題裡面當然都有講清楚我這個是要算n階層
而且這個n階層要每一個位數都要完全準確才行 這就是spec
再過來就是有沒有documentation 有沒有文件
describe 說明
你是怎麼樣的用他 還有他是怎麼樣工作的
那當然阿 我們這裡其實
不太要各位寫這個報告式的文件 當然我們後面有習題會要各位寫報告
那個就是要文件說明
那這裡呢 就是
我們是在你的program 你要或多或少加入一些註解
這個註解其實還不是文件
文件其實像是pseudo code 或者是一些做出來的report 那才叫文件
那你寫在program還是program的一部份 只是可讀性變高而已
再下來 下一個
effectively 就是 有效的
使用一些function 能夠 來
產生一些邏輯的function 是不是有效的
你的program是不是有效率 聽起來就是你的方法是不是有效率
再來 你的code是不是readable 這個很重要阿
這個你最好把他打兩個圈阿
你的code是不是readable
有個人就覺得說 我的code寫出來能用就好了
錯
你的code可讀性要高
換句話說 你的思考方式、思維方式要跟其他人一樣
你不能說 我就是跟他不一樣 你不能寫個跟其他人不一樣的東西
錯 你的東西要跟人家一樣
你將來才能夠跟人家合作
我們將來開發軟體的時候
一個team裡面不會只有你一人 一個team會有很多人
開發軟體是大家一起開發的 大家一起工作
所以你寫的program code就是你的program
你的program要讓人家看得懂
你的program別人看不懂 那怎麼辦
你的program就沒用
能run也是沒用的
一定要讓人家看得懂 不能寫個天書
這個重要性在什麼地方呢
每個team在工作團隊裡面 有人可能會離開
離開之後呢 還要有人接著你的工作繼續做
如果你寫了一半的code
寫了半年 我們要開發一個軟體 大家五六個人一起做
半年之後你突然說 離職了
然後我們又召了一個新的人進來 新的人說
前面這一個 他寫了半年的code我看不懂
前面那半年全部丟掉
所以 你寫的code readable 可讀性要高這件事情非常重要
非常重要
所以你不要寫些奇奇怪怪的code
我覺得這樣寫有效率 當然有效率也是一件事情
但是可讀性是一件最重要最重要的事情
這個才能夠讓我們的團隊 生產力才能夠提高
非常重要
所以我們的助教未來 他覺得看不懂你的code
他就把你退回去
那你就把它改到 讓人家看得懂為止
我們的助教 這個武力也是高強的
他看不懂你的code的話 那其他同學更看不懂
那你將來怎麼跟別人合作 不可能的事
再下來是 有沒有有效的使用這個 primary主要的記憶體
secondary 就是次要的記憶體
主要的記憶體就是主記憶體 也就是電腦裡面的記憶體
次要的記憶體就是 譬如說我們的disk
隨身碟
或者是 現在的 SD卡
你也可以把他 SD卡 可能是介於主要跟次要之間
好 再下來
再下來
我們的CPE考試 還要重視一個東西 就是
你的run time是不是可被接受的
這個會牽涉到你的演算法
你所使用的方法 到底是不是有效率的方法
你的run time就是執行的時間 到底可不可以被接受
打個比喻好了 假設你用了一個很笨的
這個 排序的方法
來做你的什麼 大學聯考分發系統
用了很笨的方法 排序
譬如說排100個資料可能要一分鐘
排一千個資料要一個小時
排10000個資料呢 排10000個資料花一天
大學聯考現在四萬人 排四萬個資料要花一個月
如果想到這樣的sorting方法 然後把他做出來
那個sorting方法是沒有用的
因為我們大學聯考不能等你等到一個月才把順序排出來
那個是沒用的
所以呢 要問
你要排的對象 你的資料
是你的範圍有多大 你的希望寬容的時間是多少
我們班上同學不到一百個
你如果排一百個資料 花一分鐘 這可以接受
但是用同樣的方法 如果排四萬個資料要花一個月
那就不能接受了
所以要看你的資料量的多少 還有你呢
在什麼樣的環境下run這些東西
那這個呢 執行的時間 是不是有效
是不是可以被接受 這個事情就
就好比我們在CPE考試裡面
比較後面的題目 CPE考試比較後面的
如果你用土法煉鋼 通通都不可以
一定是要用有效率的方法才行
土法煉鋼 沒辦法達成題目的要求 三秒鐘
那做不出來的 不能土法煉鋼
好 接下來我們馬上看一個例子
這個例子呢 你就會感受到
兩個program 到底差異有多大 你就能感受到
問題叫作 Fibonnacci sequence
那 這個Fibonacci sequence是這樣子的
就是前面先定義兩個值 一個是0 一個是1
然後再下來呢 下一個值
是由前面的0跟1相加 得到這個1
接著這個呢 是由前面的兩個1相加 得到這個2
再下一個是3 1+2得3
2+3得到5 依此類推
所以每一個值都是前兩個相加得到的
那這個sequence為什麼叫Fibonacci sequence呢
因為Fibonacci 在12 13世紀的時候
他就想到一個數列 那這個sequence做什麼事情呢
他說他要來算一算 他家養的兔子有幾隻
好
那我們看看要怎麼把養兔子的數量
跟Fibonacci sequence把它結合在一起 link在一起
這個 現在是這樣子的
假設 假設每一對兔子
每個月可以生產一對
我們以對來當作我們量化的單位
一對就是兩隻兔子
一隻公的一隻母的
公的跟母的才能結婚生小孩
是一對兔子 一個月可以生產一對
一對是兩隻 公的母的
然後呢 我們就假設
兔子生下來之後呢
要隔開一個月 這個月生了 下個月不能生 隔一個月才能生小兔子
重要的是 這些兔子生下來之後 就永生了
不會死亡的
好 那我們就問說 第8個月 或者第3個月 到底有多少隻兔子
那我們就算看看
剛開始的時候 我們買了一對新的兔子
新的
那這個兔子呢 剛生下來 所以要隔開一個月才能生小兔子
所以再下一個月的時候
生下的是0
總數的 就是原來那一對
再過一個月
這一對當時的這一對新的兔子現在已經可以生小孩了
所以呢 這一對兔子呢 他們會生下
總數就是多少呢
新生下的這對 跟原來舊的這對 相加就是2
再下來
這個月可以生下多少兔子
可以生下一對兔子
因為在這裡 這個月新生的兔子 這時候還不能生小孩
但這個可以
這個時候 總共是3
原來的2再加上新生下來的1
3
再來呢 再來這個月
可以生下多少兔子
我們在看的時候
有時候覺得會亂掉 到底是2還是3還是1
有時候會亂掉
那其實這裡非常單純
這個3代表什麼意思 代表舊的兔子跟新的兔子
但是新的兔子不能生小孩
這個2代表什麼意思
舊的兔子 所以你只要把這個2超過來
好 那我們再來看一下
那再過來 這個要填多少呢
當然我們知道要填5 那我們剛剛是說啦
這個5怎麼填的 是這個舊的兔子加上新生的兔子
得到5
可是這個新生的兔子呢 事實上就是這裡的2
這裡的2
那換句話說呢 你這個5是怎麼得到的
這個5就是由
前面兩個相加 得到這個5
所以接下來 你其實上面這一列就不用在寫了
你就知道再過來得到8
為什麼說他得到8呢
因為由前面兩個相加得到這個8
那這個sequence我們就叫做Fibonacci sequence
那上面這一列 跟下面這一列 事實上是一樣的
只不過呢 他晚了兩格
晚了兩格 這個2的下一個當然就是3
這還有什麼好說的
所以他只是shift兩格而已
所以上面這一串跟下面這一串 事實上是一樣的
那這個叫做Fibonacci sequence
Fibonacci sequence這個數列 事實上
有很多個 在動物界 植物界 在生物上面
他事實上很多奇怪的現象都跟Fibonacci sequence不謀而合
非常奇妙的
那我們首先看一下
看一下這個是 上面這個是鸚鵡螺
那我們看一下鸚鵡螺他的螺旋狀是怎麼造出來的
最開始 我們的Fibonacci sequence最開始是1 對不對
所以勒 我們就有個1的正方形
一個還是1 所以又有一個1的正方形
下一個是2 所以有一個2個正方形
2的正方形一定可以畫出來 因為1+1=2
所以2的正方形一定可以畫出來
因為他的邊長就是這兩個相加
再過來 3 1+2=3
1+2=3 所以這個邊長剛剛好可以畫這樣
這個是2 這個是3
再下來呢 2+3得到5
這個是2 這個是3 所以這個5的正方形一定可以畫出來
2+3得到5
那邊那個 一樣 再過來是8
3+5得到8
再過來 很大了
13
這個就是 我們再把他從裡面
把它繞一圈 沿著這個邊線 正方形的邊邊
把它繞出來 這樣把它繞出來
他是一個由小而大的螺旋狀
由小而大的螺旋狀
這個就是鸚鵡螺的螺旋狀
就這樣做出來的
這是動物 貝殼類動物 鸚鵡螺螺旋
那當然這個 我們剛剛
這是反過來旋 我們剛剛這個就是這個方向的
他這個是反過來旋
螺旋狀
這個是動物
再來 看的是植物
這是什麼花
蛤 這什麼花
陳彥瑋 這什麼花
蛤
大聲一點 他沒聽到
向日葵 向日葵
這是向日葵 正面拍的花
向日葵的螺旋 有看到沒
有沒有人看到向日葵的螺旋
向日葵的螺旋
不容易看清楚
但是我 就一遍而已 各位眼睛要張開一點
後面的同學 不要睡覺
就這麼一次而已
你要注意看他的螺旋在什麼地方 就這麼一次而已阿
向日葵的螺旋 在什麼地方 我畫給各位看
這個是中心點對不對
好 看完了 向日葵的螺旋
剛剛各位有看到嗎
(沒有) 沒有對不對 一閃而過
對不對 瞬間完成
這個向日葵的螺旋 當然比這個複雜
因為他有很多螺旋交雜在一起
他不是只有一個 他有很多個
你就自由想像一下 從哪裡當作圓心
然後繞一圈
他就會產生一個螺旋 他有很多螺旋 不是一個而已哦
他很多螺旋纏繞在一起
所以就下一下 這樣子 他就是一個螺旋
從這邊繞他也是一個螺旋
很多螺旋
好所以呢這個我們在
動物也好 或者植物也好都可以找到一個範例
跟這個Fibonacci是息息相關的
再過來
我們來看一下 那這個Fibonacci sequence他有什麼重要性
剛剛講的是動物跟植物
接下來這個重要性呢 就跟人有相關了
跟人非常相關
那我們來看一下這個 有一個叫做
黃金比例的一個東西
Golden number 黃金比例是怎麼樣造出來的
這個 0 1 .... 這樣一個東西
那我們如果用剛剛講的recursive的定義的話
我們可以把它定義下來 這樣子
最開始的兩個是0跟1
以後的每一個 fn 都是由前兩個相加
所以這個就是我們sequence的定義了
這個是recursive 我們將來可以把他寫成program
可是我們現在先來談一談 這樣的定義
他到底有什麼樣的性質
好 那我們看一看
這樣的東西 兩者之間
13跟8的比值 連續的兩個之間他有個比值
最開始的時候你看不太清楚
慢慢的他會收斂到一個值
這個收斂的概念就是我們大一的微積分收斂的概念
當n趨近於無限大的時候 他會收斂到一個比值 固定的比值
那最開始的時候呢 看不太清楚
兩者之間他會收斂到一個比值
好 所以呢 這個什麼
fn 除以 fn-1
連續的兩個 後面那項跟前面那項 連續的兩個
當n趨近於無限大的時候 他的limit 趨近於多少
他的極限是二分之一加根號五
那這個值呢 我們就稱他為golden number 黃金比例
好 那這個值到底要怎麼算
那事實上呢 各位在大一是不是學過離散數學了
有解過這個方程式吧
difference equation
有解過這個方程式吧 這應該是最簡單的
離散數學解方程式裡面最簡單的
我所有問的東西 各位都假裝沒學過
好 那我們現在要怎麼樣去算這兩者之間的比值呢
那我們剛剛說過了 就是這個fn
跟這個fn-1
假設他們有一個比值 我們就稱他為x
那我們來看看
這個跟他比 就是x 這個跟他比完就是x
所以呢 最右邊的是1 再加 x
這個比這個就是x 任何隔壁兩個比起來就是x
然後這個比這個呢 也是x
那這個已經是x 那這個下去就是x平方
所以我們假設
我們假設 fn : fn-1 他的比值叫 x
那這個時候呢 這個方程式自然而然的就生出來了
這個就是我們在解這個difference equation這樣的一個方程式
最簡單的一個東西
好 那這個呢 這個的根
什麼時候 這個根是多少呢
這個我們就不要解了 我們直接看答案
x等於二分之一加根號五
這個一加根號五 可能各位不太有概念
一加根號五到底是多少
但黃金比例這個值 太重要了
當然可以把他開根號 算一算
當然是一個無限小數
大約等於1.62
或者1.618
這個值跟什麼有關係
這個值跟下面這個有關係
他的答案是一模一樣的
這個答案是什麼呢
就是如果我們有一條線
全長叫做x
全部的長度叫做x
然後這一條線裡面
我們在有一個黃金比例的位子
這就是黃金比例的位子
這位子是怎麼來的
這位子是說 全部的長 x
比這段 是比較長的
比1 x除以1
等於呢 這個1 比較長的那個
比 比較短的那個
等於1除以x-1
再說一遍 全部的長度就是x
比比較長的那個
等於那個長的比那個短的
就是1 : x-1
這個位子就是黃金比例的位子
這個一樣
你把他算一下 就是x平方減x減1
等於0 這個跟這一個一模一樣
跟這一個一模一樣
利用這個東西算出來的 跟我們剛剛
Fibonacci sequence所算出來的方程式 是一模一樣的
這個x呢 也就是1.618
一模一樣
這個1.618 1.618代表什麼意思
代表黃金比例的位子
那這個有些時候阿 可以看到廣告
什麼 欸 這個 欸
做了一個東西叫黃金比例啦
或者說女生非常漂亮 身材非常好阿
黃金比例啦
其實在座各位阿 可能有人剛好是1.618
就是162公分
1.618 剛剛好162公分
這是很容易的 乘以一百就對了
162公分
你的肚臍所在位子 有沒有在黃金比例的位子
下半身比較長嘛 上半身比較短嘛
如果你的位子在黃金比例的位子 那恭喜你你答對一題
你的肚臍在黃金比例的地方
1.618 所以各位如果有剛剛好 當然你也可以自己算一算阿
你如果不是剛好162公分的 你就自己加加減減吧
對不對
那 說不定有人剛好162公分
怎麼知道這個 肚臍所在位子是不是到腳底是一公尺 100公分呢
拿尺量一下就可以了
所以以後如果有一個人說他符合黃金比例 你就請他
證明
他這一點有沒有得到黃金比例的位子 肚臍所在的位子
好 那這個Fibonacci sequence跟這個golden number
非常巧妙的就結合在一起
所以這個Fibonacci sequence 剛剛我們看到這個sequence阿
這是在十二十三世紀 Fibonacci 這個人
他所講的一個sequence
可是 到後來這個sequence就非常非常有用
他不是來算兔子的數量而已 他跟黃金比例巧妙的結合在一起
接下來我們要看說 這個program要怎麼寫
就是我們怎樣產生那個Finbonacci sequence
好 第一個方式 是
interative 也就是我們寫loop的program
那這個loop的program的話 這邊就是我們的loop
最開始的就是0 那些接下來呢
接下來我們就準備把 下一個算出來
那我們來看一下計算的過程 我們稍微看一下
這個low就是代表比較低的那一個
high是代表比較高的那一個
其實計算公式 基本上就是靠這個
好 所以呢 l等於0
h等於1 我把它簡寫一下
然後再下來呢 我們準備作計算了
那這個做計算的時候呢
他就把這個l把他移位
low比他移位 這個x阿 就把它變成low的這個值
所以這個x的值就跟剛剛一樣
然後再下來呢
這個low的值呢 就把這個high把他移過來
把他移過來 所以這個low的值
然後這個high的值呢
新的high的值是前兩個相加
所以就是x跟low相加 就是這兩個相加
所以這個high的值 得到 1
所以接著我們就算出了 這一項
然後再下來 我還要繼續算的話 我再算一下
那這個x的值呢 就把這個low的移過來
所以x的值就把這個移過來 移過來的話就是1
然後再下來
low的值就是把high的值移過來 所以low的值就是1
high的值就是現在兩個相加 2
所以我們每次做的計算就是
把這個row跟high的值把他移位
把他往左移位 把他移位
然後之後把x跟l相加 得到新的high的值
那這個就是iterative
然後就看看是說這個n 你要算到多少 就可以把他算出來
所以就是這個program 基本上不難 就是從這個來的
我們在真正計算的時候 事實上我們用到的變數
就是我們這個暫存的變數 就是這個x
就是low 還有一個是high
但其實這個x跟low 等於是前兩項
high 主要就是現在新算出來的這一項
再過來 如果我們把剛剛那個概念 寫成recursive program
那就更簡單了 更像原來的這個圖
這個是各位要把他寫進去的
剛剛前面的iteration的program
看起來有點轉折
那這裡呢 這個轉折就非常小了
右上角的這個是我們數學的表示方式
下面這一個部份是我們C語言的表示方式
其實幾乎是一對一呼應
語法不同而已 格式不同 那概念內容是一模一樣的
好 所以我們看一下 這個
n小於等於1的時候
那一個是0 一個是1
這就是答案了
那否則的話呢 其他的情況就是什麼
fib fib就是這個
是recursive的
所以就是fib(n-1)也就是這一項
他recursive去算
還有一個是fib(n-2) recursive去算
這兩項去算
得到答案之後呢 再把他加起來
就得到我們最後的答案
所以這個recursive的概念 跟我們數學上表示的概念
是一模一樣的
那我們從剛剛這兩個program可以看得到
這邊的這個recursive的概念
你只要有recursive的概念之後
就變成這個recursive的program 這個幾乎不用花太多腦筋
前面的這一個 這個也是recursive的概念
可是你的program 他不是一個recursive的program
所以你看阿 雖然說
我們剛剛解釋阿 你當然可以接受說 的確可以做到我們要的這個
可是你看這個program的格式 他的長相
跟這邊的這個長相是非常不一樣的
你要稍微想一下
你要稍微想一下 把這個東西 你要想一下
那我們的recursive program呢
基本上是不太需要想的
你就直接照抄 把它從數學的格式變成C語言的格式
直接照抄 完全不用想
所以 未來各位要有個概念
recursive program是非常容易寫的
你看這個直接把他寫過來就可以
recursive program是很容易寫的
這個不是recursive
其實是比較困難的
可能跟各位的概念剛好是反過來的 就覺得recursive很難理解
recursive要理解他 不容易
但是呢 當你有recursive的這個演算法之後呢
把它變成recursive的program是自然而然的事情
不用經過任何的轉換 你就直接照抄就可以了
所以recursive的program是一件非常自然而然的事情
因為你的演算法本身就是recursive
把它寫出來的program就是recursive
好 我們在這邊就先下課休息
