Wie schreibt man die Funktion Simulation while-Schleife in Scala
Wie kann ich eine Funktion schreiben, die simuliert while-Schleife? Es sollte nimmt 2 Argumente: Bedingung und Ausdruck zu führen.
Ich habe versucht, die folgenden:
val whileLoop: (Boolean,Any)=>Unit = (condition:Boolean, expression:Any) => {
expression
if(condition) whileLoop(condition,expression)
() }
Aber es scheint, dass es nicht funktioniert, z.B. habe ich array:
val arr = Array[Int](-2,5,-5,9,-3,10,3,4,1,2,0,-20)
Auch ich habe variable ich:
var i = 0
Will ich drucken, die alle Elemente arr. Ich kann das mit dem folgenden code:
while(i<arr.length) { println(tab(i)); i+=1 }
Ich würde gerne das gleiche zu tun mit meinem while-Schleife Funktion. Aber ich kann nicht schreiben-Funktion, die Referenz auf die variable und ändern. Ich könnte passieren, dass durch die Verwendung der array mit nur einem element, z.B.
val nr = Array(0)
und Funktion:
val printArray: Array[Int]=>Unit = (n:Array[Int]) => {
println(arr(n(0)))
n(0)+=1
()
}
und dann in meiner while-Schleife:
whileLoop(nr(0)<arr.length, printArray)
Nach der Verwendung von oben genannten codes, die ich bekommen StackOverflowError und nr(0) ist gleich null. Auch die folgende Funktion:
val printArray: Array[Int]=>Unit = (n:Array[Int]) => {
println(arr(nr(0)))
nr(0)+=1
()
}
gibt das gleiche Ergebnis.
Wie kann ich schreiben die korrekte Funktion while-Schleife und verwenden, drucken Sie alle arr Elemente?
Vielen Dank im Voraus für Ratschläge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Haupt-problem mit der Umsetzung ist, dass die Bedingung und der Ausdruck ausgewertet werden, nur einmal, beim ersten Aufruf
whileLoop
. Im rekursiven Aufruf nur einen Wert übergeben, kein Ausdruck.Können Sie dieses Problem durch die Verwendung von-name Argumente:
Als Beispiel:
Beachten Sie, dass die Variablen
a
undi
richtig referenziert werden. Intern wird der Scala-compiler gebaut Funktion für die Bedingung und der Ausdruck (- block), und diese Funktionen erhalten Sie einen Verweis auf Ihre Umwelt.Beachten Sie auch, dass für mehr syntaktischen Zucker awesomeness, die Sie definieren können
whileLoop
als currified Funktion:Diese können Sie aufrufen, es gerade wie eine tatsächliche while-Schleife:
Dies ist, was ich kam mit:
es sind vor allem Ihre Funktion benötigt, diese 4 Argumente:
ich denke, der code ist ziemlich selbsterklärend:
könnte dies gemacht werden viel schöner, aber ich habe versucht, es so einfach wie möglich. Zu zählen sind alle Elemente im array, Sie es nennen würde, etwa so:
drucken jedes der Elemente:
Durch die Art und Weise, wenn Sie daran interessiert sind, diese Art von Sachen, die ich empfehlen würde u zu kaufen Funktionale Programmierung in Scala gibt es zwei Kapitel, die Sie implementieren Funktionen wie diese. Es ist eine Menge Spaß.