2016-06-14 9 views
1

Ich habe eine Implementierung des Pascals Dreieck gemacht, aber etwas ist falsch mit ihm da, wenn col match { case row => ...} es nicht korrekt die Spalte mit der Reihe entsprechen:Musterabgleich nicht variable Anpassungs gegeben

def main(args: Array[String]) { 
println("Pascal's Triangle") 
for (row <- 0 to 10) { 
    for (col <- 0 to row) { 
    val res: Int = pascal(col, row) 
    print(res + " ") 
    } 
    println() 
} 

def pascal(col: Int, row: Int): Int = { 
    col match { 
     case 0 => 1 
     case row => 1 
     case _ => pascal(col-1, row-1) + pascal(col, row-1) 
    } 
} 

Antwort

4

Ihr row Spiel ist Spiegeln des Methodenparameters. Um zu erreichen, was Sie wollen, könnten Sie versuchen, sogenannte Wächter für Ihre Musterübereinstimmung zu verwenden, z.

case n if n == row => 1 

Damit haben Sie 3 Fälle der 0 Fall der Fall, wenn n is equal to given row parameter und der default Fall. Andernfalls würde die row Übereinstimmung mit allen verbleibenden Zahlen ungleich 0 übereinstimmen, wodurch die _ Übereinstimmung am Ende niemals ausgelöst wird.

+2

Vorsicht vor Wachen - https://twitter.com/travisbrown/status/714125150711451648 –

+1

Danke für den Hinweis! –

4

Alternativ zu Martin Antwort können Sie auch Backticks für das gleiche Ergebnis verwenden:

def pascal(col: Int, row: Int): Int = { 
    col match { 
    case 0 => 1 
    case `row` => 1 
    case _ => pascal(col-1, row-1) + pascal(col, row-1) 
    } 
} 

Sie können mehr über dieses Verhalten in, zum Beispiel im Zusammenhang Kapitel der Programming in Scala book (Suche nach den Backticks Stichwort lesen)

Verwandte Themen