[英]Haskell - Defining result as a list and returning null
listX n = xs
if sum[x | x <- [2, 4..n-1], y <- [1..n-1], y `rem` x == 0] == y
then insert y xs
else return ()
好吧,第一次嘗試使用Haskell,並且只有新手Java知識導致了一些問題。 我試圖做的是將函數listX n的結果定義為名為xs的列表。 我的想法是程序會抓取從1到n的每個數字,並檢查它是否等於其正除數的總和。 顯然,我已經失敗了,需要幫助,指向我尚未理解的概念非常感激。
你的主要問題似乎是你仍然認為命令式(使用insert
) - 也是()
是值單位 - 你可能想寫[]
(空列表)而不是 - 但是這里的xs
完全未定義所以你會必須解決這個問題(我不明白如何誠實)。
我認為我可以在那里看到一個基本的想法,我認為解決這個問題的最好方法是全面列表理解(因為你似乎很了解它們) - 這是一個應該工作的版本:
listX n = [ x | x <- [1..n], sum [ y | y <- [1..x-1], x `mod` y == 0] == x]
你可以看到我改變了一點 - 首先我檢查所有x
從1
到n
如果它們可能是完美的 - 我通過總結所有適當的除數並檢查總和是否等於x
(這是工作)來做到這一點在的sum [...] == x
部分) -如果你不知道這個作品,因為你可以添加衛士列出內涵(的sum [..] == x
篩選出的所有值x
在那里,這是真正)。
為了使這個更具可讀性(並將問題分開),我建議以這樣的方式編寫它:
properDivisors :: Integer -> [Integer]
properDivisors n = [ d | d <- [1..n-1], n `mod` d == 0]
isPerfect :: Integer -> Bool
isPerfect n = sum (properDivisors n) == n
perfectNumbers :: [Integer]
perfectNumbers = filter isPerfect [1..]
perfectNumbersUpTo :: Integer -> [Integer]
perfectNumbersUpTo n = takeWhile (<= n) perfectNumbers
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.