[心得] 用 bash 算費氏數列,就當了

看板Linux作者 (項為之強)時間9年前 (2016/04/23 21:12), 9年前編輯推噓7(7015)
留言22則, 8人參與, 最新討論串1/2 (看更多)
無聊用各種方式實現費式數列, 然後用到了 bash 。 然後就當機了! 是寫在 .bashrc 裡。 source 了一次之後就有點頓,然後越來越頓。 我有一次 top 成功過,bash 吃的資源比 firefox 還多。 然後我連動個滑鼠都有問題, Ctrl Alt F2 竟然沒反應。 最後螢幕變雪花,強制關機。 當機應該和 bash 中用了遞迴有關,程式碼如下: ```````````````` febo(){ i=$1 (( j = i-1 , k = i-2 )) if (( i <= 1 )) then echo 1 else echo $(expr `febo $j` + `febo $k` ) fi } ````````````````` 現在重開機了,有什麼要注意的嗎? Fedora23 X LXDE ,開機過程沒有特別的訊息。 (我之前 ubuntu 斷電過一次,開機過程有顯示修復的訊息。) -- sent from mySQL. -- ※ 發信站: 夢之大地 (ccns.cc), 來自: 140.116.249.140 ※ 文章網址: telnet://ccns.cc/

02/30 22:66,
這作者……
02/30 22:66

02/30 28:19,
奇文共賞!!
02/30 28:19
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.102.204 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1461417144.A.702.html

04/23 21:32, , 1F
片段的程式碼無法提供有用的資訊
04/23 21:32, 1F
努力查 log 中,但不太清楚怎麼看。

04/23 21:55, , 2F
無窮迴圈是想幹嘛
04/23 21:55, 2F

04/23 21:55, , 3F
也沒有,只做一次,看錯
04/23 21:55, 3F

04/23 22:24, , 4F
用 Bash 做數字運算,除了練功外沒啥好處,玩玩就好
04/23 22:24, 4F

04/23 23:18, , 5F
你叫它算到第幾項當掉的?還有,第零項不是0嗎?
04/23 23:18, 5F
我算了兩次,結果都有出來,都在 50 以內。 第一次有點頓,之後操作都頓頓的。 又算了第二次,更頓了,結果還是有出來。 只是之後就越來越頓,就當了。 另外是在 screen 下執行的。 關於第 0 項,就隨便啦!(誤) ※ 編輯: Gold740716 (140.116.102.204), 04/23/2016 23:37:23

04/24 00:00, , 6F
fork bomb...
04/24 00:00, 6F

04/24 00:19, , 7F
而且這程式邏輯不大對,50 會呼叫 49 48,49 呼叫 48
04/24 00:19, 7F

04/24 00:20, , 8F
47,48 呼叫 47 46,...,根本一直重複呼叫呀。
04/24 00:20, 8F

04/24 00:30, , 9F
49一次,48兩次,47三次,46四次,45五次...2會執行48
04/24 00:30, 9F

04/24 00:30, , 10F
次...
04/24 00:30, 10F
邏輯問題是 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 ------------------------------- ※ 編輯: Gold740716 (140.116.102.204), 04/24/2016 00:47:28

04/24 00:55, , 11F
最簡單的費氏數列確實是會跑48次啊 不想跑這麼多次就
04/24 00:55, 11F

04/24 00:55, , 12F
要暫存
04/24 00:55, 12F

04/24 01:06, , 13F
以50項來說,用教課書的寫法,該函數會被呼叫 1226
04/24 01:06, 13F

04/24 01:06, , 14F
次。簡單說費氏數列只適合給遞迴舉例用,真的要算費
04/24 01:06, 14F

04/24 01:06, , 15F
氏,還是用基本迴圈吧。
04/24 01:06, 15F

04/24 15:41, , 16F
fork => echo $(expr `febo $j` + `febo $k` )
04/24 15:41, 16F

04/24 15:41, , 17F
這邊總共三個外部指令 會各會fork一次shell
04/24 15:41, 17F

04/24 15:41, , 18F
各自在跑各自的外部指令
04/24 15:41, 18F

04/24 15:44, , 19F
哎 不對 febo不是外部指令XD echo / expr
04/24 15:44, 19F

04/25 09:31, , 20F

04/25 09:31, , 21F
就平常負荷重一點的 sh script,如果一不小心沒去最
04/25 09:31, 21F

04/25 09:32, , 22F
佳化,也是跑得很喘,尤其是 loop+呼叫外部程式時。
04/25 09:32, 22F
文章代碼(AID): #1N6tIuS2 (Linux)
文章代碼(AID): #1N6tIuS2 (Linux)