我需要您的幫助來優化。這裏是問題:如何在Haskell中優化此代碼
什麼是最小的(嚴格爲正)自然數是不可能獲得的10倍數3,結合常用算術運算符?
這裏是我的解決方案:
import Ratio
num x 1 = [x]
num x n = num'' $ concat $ [ num' a b | i <- [1..n`quot`2], a <- num x i, b <- num x (n-i) ]
where num' a b | a==0 = [b]
| b==0 = [a]
| otherwise = [a+b,abs(a-b),a*b,a/b,b/a]
num'' (x:r) = x : num'' (filter (x/=) r)
num'' _ = []
cint x = map numerator . filter ((1==) . denominator) . num x
firstNumber x n = take 1 [ i | i <- [1..], i `notElem` (cint x n) ]
但它是如此低效。例如,當我撥打firstNumber 3 7時,需要將近30秒才能看到結果。但是,我還沒有看到firstNumber 3 10的結果,雖然我已經等了很長時間了。我怎樣才能優化它?
您是否通過優化編譯了它?另外,你能解釋一下這個問題嗎? 「用3次10次不能得到的第一個數字是什麼意思?」具體來說,我不明白「10倍3」是什麼意思。 – bheklilr
提示:你有'num'''(不是一個很好的函數名稱IMO),它基本上確保你的列表中沒有重複。爲什麼不使用'Data.Set'?這是一個更有效的獨特元素無序集合的實現,因爲它在內部被實現爲二叉樹。你可以用'num''= Data.Set.toList節省很多時間。 Data.Set.fromList',除非'num'''表示接受無限流。由於它看起來像有一個有限的搜索空間,這應該是安全的。 – bheklilr
您將使用3,3,3,3,3,3,3,3,3,3(3的10倍)。以及每個之間的四個操作數(+, - ,*,/)3.考慮所有可能性。例如,當您撥打firstNumber 3 6時,您會獲得1,2,3,... 31但不是32。現在瞭解了嗎? – sasas