Re: [問題] recursive Eule

看板C_and_CPP作者 (十三)時間13年前 (2011/05/02 08:03), 編輯推噓2(204)
留言6則, 4人參與, 最新討論串3/5 (看更多)
其實用內建型別再怎麼逼近都太無趣了,能顯示多少。 使用大數計算,我們來逼近e的小數點以下精確1000位以上。 在公式e^x = 1 + x + x^2/2! + x^3/3! + x^3/3! + x^n/n! x代1得到 e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 如果n = 4, 則整理一下會發現 e = (1 + 1/1 * (1 + 1/2 * (1 + 1/3 * (1 + 1/4)))) 所以只要能算出1/n,使用遞迴就可以解決。 動手之前,先想想: 這裡有兩個變動的數字,一個是精確度p,一個是n要算多少才能達到精確度p 可以知道的是n越大越能逼近精確度p(廢話!)。 姑且視n = p來計算,程式運算要越快越好。 程式寫法套用上面的公式,遞迴仍然使用雙變數, 先算出1/n,然後乘上一次遞迴結果,乘完後加上1,當作這一次的結果。 乘法部分,overload operator *,並且以變數unit的數值為單位相乘。 也就是說123456789 * 987654321,在unit = 5時, 採取1234 56789 * 9876 54321的方式,最後再一次進位。 程式結果: 如果輸入精確度p,精確位數要扣掉最前面的2的這一個位數, 所以精確小數點以下p - 1位。 (應該吧,只抓最前面和最後面的數字比對,無一一比對) 輸出的數字排列僅是方便我自己對答案。 精確1000位,運算時間3秒內,2000位差不多10秒。 還有很大的進步空間。 程式連結:http://codepad.org/K4d45BU3 ※ 引述《tropical72 (藍影)》之銘言: : 標題: [問題] recursive Eule : 時間: Sun May 1 18:40:13 2011 : : ※ [本文轉錄自 Programming 看板 #1DlJTBzo ] : : 作者: tropical72 (藍影) 站內: Programming : 標題: [問題] recursive Eule : 時間: Sun May 1 18:34:48 2011 : : e = 1/1!+1/2!+...+1/n! : : 欲以一個 recursive 解之 : : 目前必須用到的是 recursive_sum + recursive_fact, : : 試著化簡該公式: : : e = 1/1 + 1/1*1/2 + 1/1 * 1/2 * 1/3 + ... : = 1* (1+1/2* (1+1/3* ....(1+1/n))))) : : 這麼做請問 recursive function 該如何撰? (in c or c++ is better) : : 或能給我一份通式嗎? : : 謝謝各位不吝指教! : : ---- 分隔線 ---- my try --- : : double f(int x) : { : return (x==0 || x==1) ? 1 : ( (1.0/n+1)*f(x-1) ); : } : : 我知道這份是有問題的,展開會變成 (1/4+1)*(1/3+1)*(1/2+1)*1 : 不過想不透該如何改 : : -- : YouLoveMe() ? LetItBe() : LetMeFree(); : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 180.177.73.222 : ※ 編輯: tropical72 來自: 180.177.73.222 (05/01 18:38) : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 180.177.73.222 : → TsinTa:f(n)=f(n-1)+1/n! <---是這樣嗎?還是要用你化簡的式子? 05/01 19:01 : → bleed1979:如果是2個recursive,我可以幫你。 05/01 19:03 : → bleed1979:http://codepad.org/klyb8ZxS 或 05/01 19:04 : → bleed1979:http://pastie.org/1853074 05/01 19:04 : → bleed1979:有點作弊的寫法如下,一個recursive。 05/01 19:19 : → bleed1979:http://codepad.org/fCx0Hoy6 05/01 19:20 : : 先謝謝樓上二位的建議, e 我不是不會求, : 大多求法都避不開另寫一個階層函式, : 但發問重點是想借這題去探討另一 recursive 問題 : : double euler2(int x) : { : double ans=1.0/x; : while(x) ans = (ans+1)/x, --x; : return ans+1; : } : : 這是 non-recursive 版的,我比較好奇是 recursive how to ? : 看過 bleed1979 給的 http://codepad.org/fCx0Hoy6 應是我想要的 : 我再研究一下是否有辦法變成單變數 recursive , 謝謝各位! : ※ 編輯: tropical72 來自: 180.177.73.222 (05/01 19:43) : → tropical72:補上,bleed1979 第三個 link 似乎有些誤. 05/01 19:47 : → firejox:假如你要避開階乘 可以用連分數去做~~ 05/01 20:03 : → tropical72:@firefox: 我想我提出的 subfunc 就是連分數 05/01 20:07 : → firejox:http://codepad.org/Nlsi52T7 05/01 20:16 : → firejox:http://en.wikipedia.org/wiki/Continued_fraction 05/01 20:16 : → bleed1979:原po給的公式是否少1? 05/01 20:24 : → bleed1979:e^x =1+x+x^2/2!+x^3/3!+x^3/3!+x^n/n! x代1 05/01 20:31 : → firejox:另一種 http://codepad.org/2K0jDqS7 05/01 20:48 : → firejox:這是用 e^x=1+x+x^2/2!+...+x^n/n! 導的... 05/01 20:54 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.251.97

05/02 10:27, , 1F
這篇要m起來
05/02 10:27, 1F

05/02 11:12, , 2F
太感動惹
05/02 11:12, 2F

05/02 14:24, , 3F
我看到神之手出現了..
05/02 14:24, 3F

05/02 19:36, , 4F
看不懂耶,什麼精確數p要跟n接近,你除一個n都期待有n個精確數
05/02 19:36, 4F

05/02 19:36, , 5F
嗎?
05/02 19:36, 5F

05/02 19:37, , 6F
除以1必須是1位數精確,除以2必須是2位數精確,除以三是3位數?
05/02 19:37, 6F
文章代碼(AID): #1DlVJlvQ (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 3 之 5 篇):
文章代碼(AID): #1DlVJlvQ (C_and_CPP)