2016-08-10 2 views
2

Ich habe versucht, eine rekursive Funktion zu schreiben, die eine bestimmte Zahl als Eingabe nimmt und die Summe aller Zahlen, die Vielfache von 3 und 5 sind, von 1 an den Eingang ausgibt Nummer (3 + 5 + 9..n).Erhalte eine Einheit, wo ich eine ganze Zahl erhalten sollte

Hier ist mein Code

let rec add_nums n = 
    if n < 1 then 0 
    if (n%5 > 0) then 0 
    else n + add_nums(n-1) 
+3

Ihr erstes 'if' fehlt ein 'else'. Sollte das zweite 'if' vielleicht ein' elif' sein? – TeaDrivenDev

+1

Ich habe nie bemerkt, dass F # ein 'elif' hat! Wenn ich mehr als einen Zweig brauche, wechsle ich normalerweise von einem 'if' zu einem' match'. Danke für den Kommentar, @TeaDrivenDev: Ich habe etwas Neues gelernt. – rmunn

Antwort

7

if ‚s Ausdrücke in F # sind nicht Aussagen. Da es sich um Ausdrücke handelt, müssen die Zweige then und else den gleichen Rückgabetyp aufweisen. Was das in der Praxis bedeutet, ist, dass Sie keinen if ohne else Zweig haben können, es sei dennthen Verzweigung gibt eine Einheit zurück (wodurch der Zweig else weggelassen werden kann). Der Compiler sieht, dass else weggelassen wurde, und folgert, dass der Typ then Zweig unit sein sollte.

Dies behebt es:

let rec add_nums n = 
    if n < 1 
     then 0 
     else if (n%5 > 0) 
       then 0 
       else n + add_nums(n-1) 

Wenn Sie Ihr if formatiert ist, dass die Art und Weise, wird es solche Probleme leichter zu kontrollieren.

Und wohl könnten Sie auch beide Ihre Prädikate in einem einzigen if setzen.

+1

Diese Formatierung sieht für mich absurd aus; persönlich würde ich jeden Code Check-in, der so aussieht, rot markieren. BTW 'elif' ist ein einzelner Token, keine Notwendigkeit für 'else if'. – ildjarn

+1

Haben Sie "then" und "else" in getrennten Zeilen eingerückt, ist das für Sie "absurd"? Neugierig. – scrwtp

+1

(IMO) Das schnelle Wachstum nach rechts ist absurd, weil A) es nicht für eine lange "elif" -Kette skaliert und B) tiefe Einkerbungen im Allgemeinen einen tief verschachtelten Umfang implizieren, was hier nicht existiert. – ildjarn

6

Darf ich mutig vorschlagen, eine Übereinstimmung zu verwenden?

let rec add_nums n = 
    match n with 
    | x when x < 1 -> 0 
    | x when x % 5 > 0 -> 0 
    | _ -> n + add_nums(n-1) 

mehr Bedingungen dann Hinzufügen von etwas „leichter“ und besser lesbar werden (können) ...

Spiel zu verwenden ist auch „besser“ in der Hinsicht, dass es (möglicherweise) macht es einfacher, siehe Fehler im Rückgabewert.

Verwandte Themen