试图理解Scala树上的Scanleet

试图理解Scala树上的Scanleet,scala,Scala,我在一个Coursera的课程中,我试图理解树上的scanLeft的逻辑。 我们有以下代码: 在这里,我们有一个树作为输入(没有中间值,只有叶中的值),并返回一个带有中间值(节点中的值)的树 下面的代码给出了一个带有中间值(节点中有值)的树,返回一个没有中间值的树(a0是树t左边所有元素的约数) 最后是scanLeft代码: def scanLeft[A](t: Tree[A], a0: A, f: (A,A) => A): Tree[A] = { val tRes = up

我在一个Coursera的课程中,我试图理解树上的scanLeft的逻辑。 我们有以下代码:

在这里,我们有一个树作为输入(没有中间值,只有叶中的值),并返回一个带有中间值(节点中的值)的树

下面的代码给出了一个带有中间值(节点中有值)的树,返回一个没有中间值的树(a0是树t左边所有元素的约数)

最后是scanLeft代码:

 def scanLeft[A](t: Tree[A], a0: A, f: (A,A) => A): Tree[A] = {
      val tRes = upsweep(t, f)
      val scan1 = downsweep(tRes, a0, f)
      prepend(a0, scan1)
 }
我的问题是,为什么在下行之前必须使用上行方式? 使用upsweep我们生成中间值,然后使用downsweep我们“删除”(我们不需要使用)它们


提前感谢。

请仔细查看此部分

case NodeRes(l, _, r) => {
       val (tL, tR) = parallel(downsweep[A](l, a0, f),
       downsweep[A](r, f(a0, l.res), f))
什么是l.res?为什么有必要拥有它?(它是在upsweep创建的)我建议你在一张纸上一步一步地画出这个算法到底在做什么,简单的函数是(+x)。此外,如果您不了解smth,这也是一项非常好的技术,只需一步一步轻松地解决问题。

我了解下行(和上行)的工作原理。与使用节点中包含值的树(这是使用upsweep的原因)开始downsweep不同,不可能从叶子中仅包含值的树开始?这可能是下行代码:
def下行代码[a](t:Tree[a],a0:a,f:(a,a)=>a):Tree[a]=t match{case Leaf(a)=>Leaf(f(a0,a))case Node(l,r)=>{val(tL,tR)=parallel(下行代码[a](l,a0,f),下行代码[a](r,f(a0,l.res),f))prepend(a0,1)}/code>
 def scanLeft[A](t: Tree[A], a0: A, f: (A,A) => A): Tree[A] = {
      val tRes = upsweep(t, f)
      val scan1 = downsweep(tRes, a0, f)
      prepend(a0, scan1)
 }
case NodeRes(l, _, r) => {
       val (tL, tR) = parallel(downsweep[A](l, a0, f),
       downsweep[A](r, f(a0, l.res), f))