我在項目歐拉做problem 61,並想出了下面的代碼(以測試他們給的情況下):問題在Haskell檢測循環次數
p3 n = n*(n+1) `div` 2
p4 n = n*n
p5 n = n*(3*n -1) `div` 2
p6 n = n*(2*n -1)
p7 n = n*(5*n -3) `div` 2
p8 n = n*(3*n -2)
x n = take 2 $ show n
x2 n = reverse $ take 2 $ reverse $ show n
pX p = dropWhile (< 999) $ takeWhile (< 10000) [p n|n<-[1..]]
isCyclic2 (a,b,c) = x2 b == x c && x2 c == x a && x2 a == x b
ns2 = [(a,b,c)|a <- pX p3 , b <- pX p4 , c <- pX p5 , isCyclic2 (a,b,c)]
而且所有ns2
確實是返回一個空列表,但cyclic2
與作爲問題中的例子給出的論點,但該系列沒有出現在解決方案。問題必須出現在列表理解ns2
但我看不到在哪裏,我做了什麼錯了?
此外,我怎樣才能使pX
只得到pX (n)
高達前面pX
中使用的pX?
PS:如果你認爲我完全錯過了這個問題,我會得到我的最終解決方案與此:
isCyclic (a,b,c,d,e,f) = x2 a == x b && x2 b == x c && x2 c == x d && x2 d == x e && x2 e == x f && x2 f == x a
ns = [[a,b,c,d,e,f]|a <- pX p3 , b <- pX p4 , c <- pX p5 , d <- pX p6 , e <- pX p7 , f <- pX p8 ,isCyclic (a,b,c,d,e,f)]
answer = sum $ head ns
我想它應該是'takeWhile(<9999)',以免排除數字9999。 – Stephan202 2009-11-15 13:15:24
'sum'的類型是'Num a => [a] - > a',即它需要一個列表。然而'頭ns'將產生一個六元組。這不會編譯。那麼這個代碼怎麼能給你正確的結果呢? – Stephan202 2009-11-15 13:16:23
這是一個錯字,我可以讓'ns'的輸出成爲a..f的列表。 我不認爲9999會有影響,但我會改變它。問題出在'ns2'函數中,但我不知道它是什麼。 – 2009-11-15 14:41:31