2016-06-20 178 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 
    } 
}