まず、機能を説明する必要があります。
sumFirstOdds :: Int -> Int
あなたは再帰について考えるとき、あなたは停止点が必要になるだろう。この場合、良好な停止点は、ゼロである最初のゼロの奇数の和である。あなたはこのようなあなたのベースケースを定義することができます。
sumFirstOdds 0 = 0
それはあなたが再帰関数を書いている最初の停止点を宣言するのが習慣に取得するには良いことです。さもなければ、無限ループで簡単に終わることができます。
n > 0
の場合、最初のn
の奇数の合計を求めたいときに何が起こるかを定義する必要があります。
まず、n番目の奇数の値を取得する方法を見つける必要があります:(n * 2) - 1
。
ここでは再帰部分について説明します。いくつかの簡単な例を見ていくことで、この問題について考えることができます。我々は最初の3つの奇数の合計を取得したい場合は、我々はこのように、式を使用します。
((3 * 2) - 1) + ((2 * 2) - 1) + ((1 * 2) - 1) + 0
^ ^ ^ ^
| | | |
n == 3 n == 2 n == 1 n == 0 (base case)
同じアルゴリズムが3の要求された数から始まる、との結果に追加する使用されています同じアルゴリズムを2に対して実行し、同じことを1に対して実行し、0について再度実行します。これは、基本ケースに当たって停止します。
Haskellのコードの中に入れて、あなたはこれを書き出すことができます:
sumFirstOdds n = ((n * 2) - 1) + (sumFirstOdds (n-1))
計算は、現在のn
値に対して実行され、その値がそのn-1
値に対して使用したのと同じ関数の結果に追加されます。
は、それがこれです、最後の関数がどのように見えるかをあらためて表明するには、次の
sumFirstOdds :: Int -> Int
sumFirstOdds 0 = 0
sumFirstOdds n = ((n * 2) - 1) + (sumFirstOdds (n-1))
注:これはうまく負の入力を処理しませんが、私は簡単のためにそのを残してきた
はfactorial'はHaskellのWikibookに提示される方法 'を見てください:ここます。https://en.wikibooks.org/wiki/Haskell/Recursion – ErikR