2016-10-02 5 views
0

Ich habe Projekt Euler Gründen Gründen. Irgendwann wollte ich einen Wert mit dem Ergebnis einer Funktion vergleichen. Seitdem habe ich eine andere Lösung gewählt, aber das hat mich neugierig gemacht. Wie würde das funktionieren? Wenn ich etwas zu tun, war wie:Verwenden von Funktionen innerhalb von Bedingungen

//javascript 
if x == mathyFunction(10){ 
    //do this 
} 

function mathyFunction(y){ 
    if(y>0){ 
    mathyFunction(y-1); 
    return y; 
    } else { 
    return y; 
    } 
} 

mir bewusst bin, dass dies nicht Schwanz rekursiv ist oder etwas Phantasie, bin ich meist nur neugierig, wie die Logik dahinter funktioniert.

Wie würde der Computer das interpretieren? Würde es true zurückgeben, wenn einer der Werte == x oder würde nur True zurückgegeben, wenn alle Werte == x. Experimente haben mich raten lassen, obwohl ich weiter graben werde.

+0

Von Ihrem Code, sehe ich die mathyFunction Wicklung der 10-Wert auf Null und immer 0 zurück. Dann Vergleich mit x, und wenn x nicht 0 ist, dann wäre es falsch. – nocturns2

+0

@ nocturns2 Es gibt 0 nicht zurück, es gibt "y" zurück. – sepp2k

+0

Sie haben Recht. Ich bezog mich auf den Wert von y, was das wäre, was Sie mit dem Wert von x vergleichen würden. – nocturns2

Antwort

1

Sie haben nicht angegeben, um welche Sprache es sich handelt, aber die übliche Semantik der return-Anweisung vorausgesetzt, kann eine Funktion nicht mehr als einmal zurückgegeben werden. Also, wenn durch „alle Werte zurückgeben einzeln“, meinte Sie etwas wie folgt aus:

function f() { 
    return 1; 
    return 2; 
    ... 
} 

Dann ist alles nach dem ersten return ist nur von totem Code und es ist das gleiche, als ob die return 1 die einzige return Aussage war drin. Ein Funktionsaufruf hat genau einen Wert, und mit diesem Wert vergleichen Sie.

Wenn Sie bedeutete, dass mathyFunction eine Liste oder eine andere Sammelobjekt zurückgibt, die die Werte zwischen x und y enthält, dann x wird auf dieser Liste verglichen werden. Wiederum hängt die Semantik von der Sprache ab, aber in den meisten Sprachen ist der Vergleich einer Zahl mit einer Liste entweder ein Typfehler oder nur false.

Wenn die Werte der Rückkehr individuell Sie eine Ausbeute Aussage bezieht wurden (wie C# 's yield return oder Pythons yield), dann ist das Ergebnis der Funktion eine Art von Iterator-Objekt sein wird und die gleiche wie im vorherigen Absatz gilt.

+0

Entschuldigung, ich hätte genauer sein sollen. Es ist Javascript. Der Code hinter 'mathyFunction' ist rekursiv, so dass er zurückkehrt und dann einen Wert zurückgibt. Ich habe das Beispiel leicht modifiziert, um dies zu reflektieren, und ich habe 'mathyFunction (x, y)' zur Einfachheit in 'mathyFunction (x)' geändert. – Ucenna

+0

@Ucenna Die Funktion in Ihrer bearbeiteten Frage ist die Identitätsfunktion. In beiden Fällen des "if" geben Sie nur "y" zurück. In dem Fall rufen Sie die Funktion auch rekursiv auf, aber da Sie nichts mit dem Ergebnis des rekursiven Aufrufs tun, macht das nichts (außer, dass der Code länger dauert, es sei denn, die JavaScript-Engine kann diesen Aufruf optimieren) . Nochmals: Ein Funktionsaufruf kann nicht mehr als einmal zurückgegeben werden - die Rekursion ändert das nicht. – sepp2k

+0

Okey Dokey dann! Ich arbeitete mich zu diesem Schluss hin. Was Sie gesagt haben, passt perfekt zu meinen Ergebnissen. – Ucenna

Verwandte Themen