2016-06-20 176 views
2

我有一類情況是這樣的:斯卡拉遞歸案例類減少

case class Test(i: Int, t: Option[Test]) 

我現在想減少這種情況下類,並添加所有的我的。 。因此,舉例來說,如果我有這樣的

val x = Test(1, Some(Test(2, Some(Test(3,None))))) 

輸入我希望得到的結果是6,在這裏是我到目前爲止已經試過:

def all(acc: Int, test: Test): Int = { 
    if (test.t.isDefined) 
    all(acc, test.t.get) 
    else 
    acc + test.i 
} 

這給了我3,我看到我錯過了遞歸中的某個小細節,我無法看到它在哪裏!任何線索?

+3

遞歸時你是不是總結,再加上你沒有返回累加器。 –

+0

你能詳細說明一下嗎?即使做完了,我仍然得到3! – sparkr

+1

在遞歸調用中,您還需要將'i'添加到'acc':'all(acc + test.i,test.t.get)'。 –

回答

1

你去那裏:

def sum(acc: Int, test: Test): Int = { 
    test.t match { 
    case Some(x) => sum(acc + test.i, x) 
    case None => acc + test.i 
    } 
} 

和版本沒有累加器:

def sum(test: Test): Int = { 
    test.t match { 
    case Some(x) => test.i + sum(x) 
    case None => test.i 
    } 
}