用 bash 算費氏數列,就當了 - Linux

Eartha avatar
By Eartha
at 2016-04-24T23:17

Table of Contents

※ 引述《Gold740716 (項為之強)》之銘言:
: febo(){
: i=$1
: (( j = i-1 , k = i-2 ))
:
: if (( i <= 1 ))
: then
: echo 1
: else
: echo $(expr `febo $j` + `febo $k` )
: fi
: }
:
:
: 邏輯問題是 febo 1 和 febo 0 都回傳 1 ,
: 所以 febo 2 = 2 ,也就是我第 0 項變成 1 ;而不是 0 。
: 我想知道 fork 炸彈在哪,小弟功力不足。
:
: -------------------------------
: x | 0 1 2 3 4 5 6
: --------+----------------------
: febo x | 1 1 2 3 5 8 13
: -------------------------------
:

都已經知道了, 所以就不要偷懶, 讓 0 echo 0 不就好了?

febo(){
i=$1
(( j = i-1 , k = i-2 ))

if [ $i -eq 0 ]
then
echo 0
elif [ $i -eq 1 ]
then
echo 1
else
echo $(expr `febo $j` + `febo $k`)
fi
}

然後你可以算一下, 每呼叫一次,
0 & 1 會呼叫 echo
>1 時會呼叫 echo 跟 expr 各一次.

小弟個人不喜歡用 bash 專有的 (( )) 跟 $() 來寫 script.
不知道(()) 跟 $() 會不會 fork 子程序?

50 會呼叫 49/48, 49 會呼叫 48/47
也就是 50 第 1 次被呼叫,接著
49 會被呼叫 1 次
48 被呼叫 2 次 (50 跟 49)
47 被呼叫 3 次 (49 跟 48)
46 被呼叫 5 次 (48 跟 47)
45 被呼叫 8 次 (47 跟 46)
依此類推. 總共會被呼叫... 剛好跟費式數列一樣的次數 (之前的推文算錯了...)
而這些程序在數列算完之前都不會結束 (遞迴的特性), 所以要累加起來.

0 & 1 共有 32,951,280,099 次
>1 的共有 20,365,011,073 次
總共會 fork 出 73,681,302,245 個子程序

所以, 你現在可以原諒系統當掉了嗎?

還是用一般迴圈來算吧.

fibo[0]=0
fibo[1]=1
i=2
while [ $i -le $1 ]
do
fibo[$i]=`expr ${fibo[$i-1]} + ${fibo[$i-2]}`
i=`expr $i + 1`
done
echo ${fibo[$1]}

不過費式不拿來練習遞迴, 光算出值好像沒啥用...
而且超過 92 位, expr 就 overflow 了... 哈哈

Rickie MBPr:0 rickie$ time ./go.sh 92
7540113804746346429

real 0m0.386s
user 0m0.155s
sys 0m0.221s

Rickie MBPr:0 rickie$ time ./go.sh 93
expr: overflow


real 0m0.415s
user 0m0.163s
sys 0m0.241s

--
Tags: Linux

All Comments

Joseph avatar
By Joseph
at 2016-04-29T07:43
其實我也不確定 (( )) 跟 $() 是不是只有 bash 能用?
Dorothy avatar
By Dorothy
at 2016-05-02T11:31
我翻了 log 只算到 9……
Faithe avatar
By Faithe
at 2016-05-02T23:21
用ulimit 玩, 到 15 就不想等了
Delia avatar
By Delia
at 2016-05-06T16:24
樓上原 po 忘了換帳號?
Odelette avatar
By Odelette
at 2016-05-11T00:18
15 就要 fork 三千多次了...
Joseph avatar
By Joseph
at 2016-05-11T11:25
遞迴的話,bash 20 C 45 都是 30 秒內出的來
Oscar avatar
By Oscar
at 2016-05-15T09:52
忘了換帳號 冏
Ula avatar
By Ula
at 2016-05-15T23:22
(( )) 是 bash 語法,$() 是標準 shell 的語法
Andrew avatar
By Andrew
at 2016-05-18T02:08
標準 shell 也沒有支援陣列
Sarah avatar
By Sarah
at 2016-05-22T07:35
其實不一定要用 (( )) 或 expr,有 $(( )) 可以用
Erin avatar
By Erin
at 2016-05-25T06:31
剛才測試 ksh 和 zsh 好像也有支援 (( )) 和 陣列

Linux 網路防護 推薦的書

Valerie avatar
By Valerie
at 2016-04-24T13:16
因為自己玩伺服器,也有VPS(還被駭過) 所以想要認真看一下要怎麼抵禦 也沒有什麼推薦的書,目前應該會先從學校圖書館找起 另外,我目前SSH禁用密碼登入,改port 還有什麼可以加強的? ----- Sent from JPTT on my Sony D6563. -- Java Android程設學習 ...

Ubuntu Mate 16.04 LTS 發佈了

Edwina avatar
By Edwina
at 2016-04-24T10:07
發表日期:2016/04/21 支援至 2019 年 04 月 這是Ubuntu Mate的第一個官方長期支援版本 特色:走Ubuntu懷舊風,給使用者Ubuntu 8.04時期的使用體驗 比較: Ubuntu 8.04: http://goo.gl/kSmW3H Ubuntu Mate 16.04: ht ...

遠端Xserver速度

Cara avatar
By Cara
at 2016-04-23T22:21
請問遠端用SSH來傳X11有什麼辦法讓他速度快一點嗎? 因為我在遠端開Unity一直出現顯示太低而無法使用(Unity使用OpenGL) (在此Unity指的是做遊戲的Unity3D 不是Ubuntu的Unity桌面) Xserver使用VcXsrv最新版的(Windows 7) - ...

用 bash 算費氏數列,就當了

Jack avatar
By Jack
at 2016-04-23T21:12
無聊用各種方式實現費式數列, 然後用到了 bash 。 然後就當機了! 是寫在 .bashrc 裡。 source 了一次之後就有點頓,然後越來越頓。 我有一次 top 成功過,bash 吃的資源比 firefox 還多。 然後我連動個滑鼠都有問題, Ctrl Alt F2 竟然沒反應。 最後螢幕變雪花,強 ...

遠端ssh連線回傳畫面問題

Sarah avatar
By Sarah
at 2016-04-23T07:59
各位前輩好 最近因為嵌入式系統開始接觸Linux 有鑑於開發的便利性,我都從windows用putty連上開發版實作 之前有上網查要怎回傳程式產生的GUI 經過設定後我卻還是無法回傳畫面,狀態如下圖(用mathematica當例子) http://i.imgur.com/yvHLvXI.png?1 我的 ...