2014-02-05 211 views
3

這階乘實現適用於人數達到一定規模:模式匹配BigInts

def factorial(n:Int):Int = n match { 
    case 0 => 1 
    case x => x * factorial(x - 1) 
} 

我試圖用BigInt有,使之成爲各種規模的數字像這樣工作

val zero = BigInt(0) 
def factorial(n:BigInt):BigInt = n match { 
    case zero => 1 
    case x => x * factorial(x - 1) 
} 

每個呼叫到階乘無論n的值是多少,都返回1。我認爲這是因爲第一種情況下總是匹配,並證明它是如此,改成

case zero => 22 

和驗證22,每輸入返回。

所以我問題是

  1. 爲什麼第一種情況下總是匹配?
  2. 有沒有辦法讓這個函數的BigInt版本工作,同時堅持模式匹配?
+0

您也可以使VAL開始用大寫字母,比如'Zero'。 – dhg

回答

5

您應該重命名zeroZero或使用這樣的:

case `zero` => 1 
+0

你能解釋一下這個語法是什麼嗎?我是scala的新手 – jtkSource

+0

@jtkSource請參閱[Scala中的編程/案例類和模式匹配]中的變量或常量?**(http://www.artima.com/pins1ed/case-classes-and-pattern- matching.html) – senia

3

來匹配一個變量,「`」把它包

val zero = BigInt(0) 
def factorial(n:BigInt):BigInt = n match { 
    case `zero` => 1 
    case x => x * factorial(x - 1) 
}