簡體   English   中英

Haskell - 將結果定義為列表並返回null

[英]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]

你可以看到我改變了一點 - 首先我檢查所有x1n如果它們可能是完美的 - 我通過總結所有適當的除數並檢查總和是否等於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM