1
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 までのすべての数を取得し、それが正の約数の合計に等しいかどうかをチェックするというものでした。明らかに、私は恐ろしく失敗しており、助けが必要です。私が理解していない概念へのポインタは非常に高く評価されています.

4

1 に答える 1

3

あなたの主な問題は、あなたがまだ命令的であると考えているようです(を使用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) 。 - リスト内包表記にガードを追加できるため、これが機能することを知らない場合に備えて (これが true である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
于 2015-10-06T14:01:12.920 に答える