2016-11-14 4 views
4

Ich versuche, den Turm von Hanoi zu machen, aber ich weiß nicht, wie man einen Zählinkrementierer hinzufügt. Hier ist mein Code:Wie füge ich einen Inkrementierungszähler in F hinzu?

open System 

let disks = Int32.Parse(Console.ReadLine()) 

let rec hanoi num start finish = 
    match num with 
    | 0 -> [ ] 
    | _ -> let temp = (6 - start - finish) 
    (hanoi (num-1) start temp) @ [ start, finish ] @ (hanoi (num-1) temp finish) 

[<EntryPoint>] 
let main args = 
    (hanoi disks 1 2) |> List.iter (fun pair -> match pair with 
| a, b -> printf ": %A %A\n" a b) 
    0 

Ich versuche, um es so etwas wie dieses

1: 1 3 
2: 1 2 
3: 3 2 
etc... 

Ich bin mir dessen bewusst zu drucken, dass es keine Formatierung Satz für den

1: 
2: 
3: 

Teil. Ich weiß, dass die richtige Formatierung

"%A: %A %A\n" *with some counter here* a b 

ist, aber ich weiß nicht, wie das geht. Ich habe im Internet nach einer Antwort gesucht, aber ich habe nichts gefunden. Wenn mir jemand helfen könnte, wäre das sehr zu begrüßen.

Vielen Dank im Voraus

+3

[Liste.iteri] (https://msdn.microsoft.com/visualfsharpdocs/conceptual/list.iteri%5b%27t%5d-function-%5bfsharp%5d) gibt Ihnen den Zähler. – s952163

+0

Dies ist für Ihre Frage irrelevant, aber Sie können sich die Dateien '.fsx' und [F # interaktiv] (https://docs.microsoft.com/en-us/dotnet/articles/fsharp/tutorials/fsharp) ansehen -interaktiv /) wenn Sie die Sprache lernen - Sie müssen gar keinen Code kompilieren, und Sie können das Feedback direkt im selben Fenster ändern. Sie können Code in Visual Studio an F # interactive senden, indem Sie ihn markieren und die Taste drücken. –

Antwort

6

s952163 die comment ist die richtige Antwort hier, aber hier ist ein bisschen mehr Erklärung mit ihm zu gehen.

List.iteri sieht sehr ähnlich zu List.iter, nur Ihre Funktion wird dann zwei Argumente haben - den Zähler und das Listenelement. Hier, das würde aussehen wie

hanoi disks 1 2 |> List.iteri (fun i (a, b) -> printfn "%d: %d %d" i a b) 

Anmerkung: Ich habe auch ein paar Möglichkeiten, enthalten diese Zeile Code zu vereinfachen, indem

  • die unnötigen Klammern um die hanoi Funktion zu entfernen - die Rohrbediener |> hat sehr niedrige Priorität, so Klammern sind in der Regel nicht erforderlich, um seine Argumente
  • mit printfn statt printf "...\n" zu trennen - ersteres ist bevorzugt, weil es wird Verwenden Sie die korrekte Form der Zeilenendung. Unter Windows ist dies eigentlich "\ r \ n" (obwohl es beim Schreiben in die Konsole keine Rolle spielt)
  • Entfernen der Musterübereinstimmung von der Lambda-Funktion - Sie sind eigentlich kein Mustervergleich, weil Das Tupel (a, b) ist ein Typ selbst. Sie können die Argumente direkt im Funktionsaufruf abrufen und sich ein wenig Tipparbeit ersparen.
Verwandte Themen