[問題] 跑遞迴數列效率問題

看板Python作者 (吸收正能量)時間10月前 (2023/07/02 12:15), 編輯推噓2(2010)
留言12則, 4人參與, 10月前最新討論串1/2 (看更多)
想請教 若我想利用python中的套件sympy 去計算出某遞迴數列的理論值 遞迴數列定義如下: a_{n+2}=2*sin(15度)*a_{n+1}-a_n a_1=2 a_2=2*sin(15度) (不太確定套件這樣用是否適合,總之跑得動,但要求14項數 之後的取值,就會卡住不動) 碼如下: from sympy import * memo = {0:2, 1: (sqrt(6)-sqrt(2))/2} def sinus_seq(n): if not n in memo: memo[n] = (2*(sqrt(6)-sqrt(2))/4)*sinus_seq(n-1)-sinus_seq(n-2) return memo[n] for i in range(12): print("c[{}]={}".format(i,simplify(sinus_seq(i)))) 執行時,當我把倒數第二列的range(k)改為k=15時, 利用計算時間的套件 顯示出來的訊息 CPU times: total: 4min 8s 而k=12的訊息為CPU times: total: 12.7 s 數字k更大k>15,就會卡住不動了 想請教有沒有可以改善更有效率的output出更多項的方法??例如要跑到第3000項數列值 先謝謝高手願意分享! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.207.148 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1688271340.A.088.html

07/02 13:36, 10月前 , 1F
為啥是用dict?
07/02 13:36, 1F

07/02 13:37, 10月前 , 2F
要先simplify後才存入memo
07/02 13:37, 2F

07/02 13:41, 10月前 , 3F
可以用functools.lru_cache來達成你想要的效果
07/02 13:41, 3F

07/02 13:50, 10月前 , 4F

07/02 14:08, 10月前 , 5F
if n==0: return 2
07/02 14:08, 5F

07/02 18:47, 10月前 , 6F
也太神奇了吧..原來有這種東西可以用 To 1F用dic不好嗎?
07/02 18:47, 6F

07/03 06:23, 10月前 , 7F
即然算第n項遞迴會把比n小的每一項都跑過一次,是不是直
07/03 06:23, 7F

07/03 06:23, 10月前 , 8F
接從N=1開始往上建表就好
07/03 06:23, 8F

07/03 10:58, 10月前 , 9F
你也可以cache simplify會更快
07/03 10:58, 9F

07/03 10:59, 10月前 , 10F

07/03 11:47, 10月前 , 11F
3Q~使用裝飾器好像會拖速
07/03 11:47, 11F

07/03 11:49, 10月前 , 12F
simplify = lru_cache(simplify)這個動作怎麼想到的?
07/03 11:49, 12F
文章代碼(AID): #1aeFdi28 (Python)
討論串 (同標題文章)
文章代碼(AID): #1aeFdi28 (Python)