我有一个执行计算的函数,但我使用var来接收递归函数的值,我想避免使用可变变量。
def scoreNode(node:Option[Tree], score:Double = 0, depth:Int = 0):Double = {
node.map(n => {
var points = score
n.children.filter(n => n.valid == Some(true)).foreach(h => {
points = scoreNode(Some(h), 10, depth+1)
})
points
}).getOrElse(score)
}
如何在没有可变变量的情况下重写这段代码?我试过了
答案 0 :(得分:2)
您实际上在做的是对树中所有节点进行求和。尝试写一个更惯用的代码,就像这样。
def scoreNode(node:Option[Tree], depth:Int = 0):Double =
(for {
n <- node
h <- n.children
if h.valid == Some(true)
res = scoreNode(Some(h), depth + 1) + scala.math.pow(0.8, depth)
} yield res).sum
我不保证这完全有效。这是你做正确的功课。
答案 1 :(得分:1)
您可以使用fold
:
def scoreNode(node:Option[Tree], score:Double = 0, depth:Int = 0):Double =
node
.map(_.children.filter(n => n.valid == Some(true)).fold(score)((acc, h) => scoreNode(Some(h), acc + scala.math.pow(0.8, depth), depth + 1)))
.getOrElse(score)