Zunächst müssen Sie Ihre Funktion beschreiben.
sumFirstOdds :: Int -> Int
Wenn Sie darüber nachdenken, Rekursion, Sie gehen einen Haltepunkt zu müssen. In diesem Fall ist ein guter Haltepunkt die Summe der ersten ungeraden Zahlen Null, die Null ist.
sumFirstOdds 0 = 0
Es ist gut zu bekommen in die Gewohnheit, erklärt den Haltepunkt zuerst, wenn Sie eine rekursive Funktion gerade schreiben: Sie können Ihre Basisfall wie folgt definieren. Ansonsten kann es leicht zu Endlosschleifen kommen.
Jetzt müssen wir definieren, was passiert, wenn wir die Summe der ersten n
ungeraden Zahlen finden möchten, wenn n > 0
.
Sie müssen zuerst einen Weg finden, um den Wert der n-ten ungeraden Nummer zu erhalten: (n * 2) - 1
.
Jetzt für den rekursiven Teil. Es kann Ihnen helfen, über das Problem nachzudenken, indem Sie ein paar einfache Beispiele durchgehen. Wenn wir die Summe der ersten drei ungeraden Zahlen erhalten wollten, würden wir diese Formel wie folgt verwenden:
((3 * 2) - 1) + ((2 * 2) - 1) + ((1 * 2) - 1) + 0
^ ^ ^ ^
| | | |
n == 3 n == 2 n == 1 n == 0 (base case)
Der gleiche Algorithmus verwendet wird, um die angeforderte Anzahl von 3 beginnt und es auf das Ergebnis der Zugabe Derselbe Algorithmus läuft gegen 2, macht dann dasselbe für 1 und wieder für 0, wo wir unseren Basisfall treffen und stoppen.
setzen in Haskell Code, könnte man dies schreiben als:
sumFirstOdds n = ((n * 2) - 1) + (sumFirstOdds (n-1))
Die Berechnung wird gegen den aktuellen n
Wert durchgeführt wird, und dieser Wert wird auf das Ergebnis der gleichen Funktion gegen diesen n-1
Wert verwendet hinzugefügt .
Um es zu wiederholen, was die endgültige Funktion aussieht, es ist dies:
sumFirstOdds :: Int -> Int
sumFirstOdds 0 = 0
sumFirstOdds n = ((n * 2) - 1) + (sumFirstOdds (n-1))
Hinweis: diese nicht behandelt negativen Eingang gut, aber ich habe die aus Gründen der Einfachheit weggelassen
Werfen Sie einen Blick darauf, wie 'factorial' in der Haskell Wikibook präsentiert: hier: https: //en.wikibooks.org/wiki/Haskell/Recursion – ErikR