ハスケルのGCF/LCM

私はハスケルにとって非常に新しいです。

ハスケルで GCF やLCM(Least Common Multiple)を見つける簡単な方法はありますか?

5

4 答え

GCFでは、最大公約数、または最大公約数を意味しますか?これは、 lcm のように、プレリュードから入手可能な gcd です。

12
追加された

私はLCFが何であるか分かりませんが、GCFはHaskellのお気に入りです。 Euclidean Algroithmを使うと、Haskellの動作を実際に理解することができます。 http://ja.wikipedia.org/wiki/Euclidean_algorithm アルゴリズムがここに設定されています。 http://en.literateprograms.org/Euclidean_algorithm_(Haskell)

このタイプの再帰はHaskellでよく見られ、どのように表現力豊かな言語ができるかを示しています。

gcd a 0 = a
gcd a b = gcd b (a `mod` b)

これは引数のパターンマッチングを使用して任意の数の最大公約数を表し、0が最初の数を表します。数字が両方ともゼロでない場合、第2の最大公約数と第2の第1のmodを探します。最終的に、これは2番目の引数で0になります。これは、最初のパターンをトリガーし、答えである最初の引数を返します。

[編集]

関数は実際には次のようになります。

gcd a 0 = a
gcd a b = b `seq` gcd b (a `mod` b) where

これにより、以前の再帰ステップ(a mod b)の評価が強制され、たとえばGCDing 1243235452と6095689787662の場合、メモリに膨大なサンクが組み込まれなくなります。Seqは、 Weak Head Normal Form "を使用するか、引数の最も外側のデータ構造を評価します。

7
追加された
Tbh seq を追加する理由は、FPやHaskellを初めて使う人にとっては本当に役立つものではないと私は思う。例:弱いヘッドの通常のフォームとは何ですか? 最も外側のデータ構造とは何ですか?何から?このようにすると、 seq を書いていないと、Haskellはまったく愚かなことをしているように思えます。そしてなぜ where には何もついていないのですか?
追加された 著者 Zelphir,
絶対に。 OPはハスケルにとっては新しいものですが、これを学ぶのに良い時期です。
追加された 著者 Erik Hinton,
OPはおそらくこれを知っているかもしれませんが、 lcm a b = let g = gcd a b in(div a g)* b
追加された 著者 Sumudu Fernando,
おそらくここに seq を追加するべきでしょう。
追加された 著者 alternative,
b はすでに0に等しいかどうかを調べるために評価されているため、 seq は必要ありません。
追加された 著者 Mike Spivey,

gcd is imported in the prelude. That means that you can use it whenever you want without going anything. Erik Hinton shows a simple version of the Euclidean algorithm, if you are interested in implementing your own. One thing though: / is used only for floating point division, use div and mod to find the quotient and remainder when you want to do "integer division." The prelude also defines a lcm function for least common multiple.

3
追加された

または、あなたもすることができます

euclid(n,m) =
  if n == m then n
  else if n < m then euclid(n, m-n)
    else euclid(n-m, m)
0
追加された