繁体   English   中英

循环嵌套列表的功能方法

[英]Functional way to loop over nested list

我有一个问题来比较两棵树。 如下所示:

case class Node(elem:String, child:List[Node])

为了比较树的每个元素,我有以下功能:

def compare(n1:Node, n2:Node): Boolean {
   if(n1.elem == n2.elem){
      return compare(n1.child, n2.child)
   }
}

def compare(c1:List[Node], c2:List[Node]): Boolean {
    while (c1.notEmpty) {
       //filter, map etc call function above to compare the element recursively
    }
}

基本上算法是针对n1中的每个元素,我们正在检查n2中的匹配。 我被告知这是非常必要的方式而不是功能方式。 什么是实现这种行为的功能性方法。 换句话说,在比较孩子列表时,我们如何删除while循环?

考虑拉上两个列表,并使用forall持有true只有当每一个谓语,它处理的计算结果为true ; 比如这样,

def compare(c1: List[Node], c2: List[Node]): Boolean = 
  (c1.sorted zip c2.sorted).forall(c => compare(c._1,c._2))

请注意, forall将在遇到第一个false停止评估。 通过为填充长度差异定义EmptyNode类,可以使用zipAll解决不等长节点列表的情况; 两个列表也可以比较true

更新 @JohnB评论后的健全节点的排序列表。

如果我正确理解了您的问题,您希望将第一个列表的每个元素与第二个列表的每个元素进行比较。 以下代码实现了这一点。 它通过尾递归摆脱了while循环。

import scala.annotation.tailrec

def cmp(a:Int, b:Int) = a > b

@tailrec
def compare(xs: List[Int], ys: List[Int]): Boolean = xs match {
    case Nil => true
    case head :: tail if ys.forall(x => cmp(head, x)) => compare(tail, ys)
    case _ => false
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM