2009-10-15 21 views
0
以前的答案

我做的項目歐拉問題63,我必須找到存在的數量,其中:如何使哈斯克爾使用另一個列表取決於哈斯克爾

x^(n) == y 

ny長度。

它很快出現,對於奇之間的這種交替條件的結果,甚至,所以我在Haskell想出了這一點:

prob63 = [ n | n <- nums n , i <-[1..10], i^(length $ show n) == n] 

nums n | odd (n) == True = filter odd [n..] 
    | otherwise   = filter even [n..] 

如果n < - [1 ..],prob63產生流,其看起來像這樣:

[1,2,3,4,5,6,7,8,9,16,25,36,49,64,81,125,216,343,512,729,1296,2401,4096,6561,16807,32768,59049,117649,262144,531441] 

但是這很慢,我後來想到的不起作用。我需要的是,根據以前的答案,它將開始測試來自n的奇數或偶數。我如何從現有的東西中解脫出來?

回答

2

再看看輸出。元素不要奇數和偶數之間交替!

1,2,3,4,5,6,7,8,9,16,25,36,49,64,81,125,216,343,512,729,1296,2401,4096,6561,16807,32768,59049,117649,262144,531441]

我實現你要求的代碼後,注意到這一點。它的輸出與您的代碼的輸出不匹配。無論如何,我會在這裏發佈代碼:

prob63 :: [Integer] 
prob63 = test 1 
    where 
    test s = next : test (next + 1) 
     where 
     next = head [n | n <- [s,s+2..], i <-[1..10], i^(length $ show n) == n] 
+0

難道那個單對只是一個異常情況? –

+0

不,還有另一個,你可以看到:59049,117649。此外,也許你應該迭代基礎和權力(而不是權力和* n *),並確定兩者的上限。這個問題有一個非常快速的解決方案。 – Stephan202

+0

此外,它似乎在學習Haskell的這個階段,我知道需要做什麼,但我常常不知道如何實現它。我想到了一個優化,它開始搜索n的下一個值,即'(當前n)+(當前與之前的差值)' –