Re: [問題] 關於遞迴加快速度的迷思?

看板C_and_CPP作者 (我要加入劍道社!)時間10年前 (2013/09/05 23:28), 編輯推噓5(5011)
留言16則, 8人參與, 最新討論串4/10 (看更多)
※ 引述《adrianshum (Alien)》之銘言: : ※ 引述《Feis (永遠睡不著 @@)》之銘言: : [43] : 請教一下。 : 你提到,iteration 型式做到的比較有效的方法,其實 : 也可以在 recursive 中做到。這點我有點搞不清楚。 : 比如用 fibbonachi number 做例子,我想一想,其實可以 : 寫成沒快取,也毋需重覆計算的樣子: : int fib(int n) { : if (n <= 1) { : return 1; : } : int fn = 1; // f(n) : int fn_1 = 0; // f(n-1) : for (int i = 1; i < n; i++) { : int newFn = fn + fn_1; : fn_1 = fn; : fn= newFn; : } : return fn; : } : 這樣既無快取,也沒有重覆計算。可是recursion 的情況 : 要怎樣做到相同效果? 簡單到莫名奇妙的程度 XD int fibb(int n, int a = 1, int b = 0) { if(n <= 0) return a; else return fibb(n-1, a+b, a); } int main() { for(int i = 0; i < 10; ++i) cout << fibb(i) << endl; return 0; } 其實把迴圈改成 tail call 是相當有趣的經驗 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.39.238.242 ※ 編輯: littleshan 來自: 202.39.238.242 (09/05 23:29) ※ 編輯: littleshan 來自: 202.39.238.242 (09/05 23:30)

09/05 23:36, , 1F
(頭暈.. 會不會有點太不直覺了?)
09/05 23:36, 1F

09/05 23:37, , 2F
其實不會喔 你可以想一想最大公因數(歐幾里得算法)的遞迴版
09/05 23:37, 2F

09/05 23:37, , 3F
它的型式跟這篇的 fibb 非常之像
09/05 23:37, 3F

09/05 23:38, , 4F
(雖然計算方向上是一個向上一個向下就是了 XD)
09/05 23:38, 4F

09/06 00:07, , 5F
圖解了下運算過程.. : http://ppt.cc/xhYp
09/06 00:07, 5F

09/06 00:10, , 6F
從計算過程上來看 fibb 已經不是遞迴關係式了說
09/06 00:10, 6F

09/06 00:11, , 7F
反而比較像是用程式語言的遞迴程序(函數)實現遞迴關係式
09/06 00:11, 7F

09/06 00:13, , 8F
的計算過程~ (心得)
09/06 00:13, 8F

09/06 00:14, , 9F
咳咳.. 補一下: 所以才會覺得不太直覺就是了~
09/06 00:14, 9F

09/06 00:24, , 10F
尾遞迴基本上需要計算參數,所以才讓樓上覺得不像遞迴吧,
09/06 00:24, 10F

09/06 00:35, , 11F
改法是有規律的,是DP常見手法
09/06 00:35, 11F

09/06 00:51, , 12F
就是把要記憶的快取空間壓縮後放在參數,迴圈則是放在區域變
09/06 00:51, 12F

09/06 01:25, , 13F
在函式引數寫賦值 第一次看到這種寫法...
09/06 01:25, 13F

09/06 01:43, , 14F
參數預設值啊,比 overload 有用
09/06 01:43, 14F

09/06 08:14, , 15F
s3748679: 圖解真清楚
09/06 08:14, 15F

09/06 09:05, , 16F
給個讚。我自己太笨了,被原本的遞迴限制了想法
09/06 09:05, 16F
文章代碼(AID): #1IAACQ0j (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 4 之 10 篇):
文章代碼(AID): #1IAACQ0j (C_and_CPP)