利用模式匹配和递归计算list

本文介绍使用Scala实现树形结构的递归遍历,包括求解叶子节点之和及表达式树的计算结果。文章通过具体示例展示了如何定义树节点与叶子节点,并实现递归函数来处理这些树形结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

val l = List(List(9,8),8,List(12))

 def leafSum(l: List[Any]): Int = l.map(_ match {
   case l: List[Any] => leafSum(l)
   case x: Int => x
   case _ => 0
 }).sum

 println(leafSum(l))

/****************************************/
//使用新方法实现
sealed abstract class BinaryTree
case class Leaf(value: Int) extends BinaryTree
case class Node(left:BinaryTree,right: BinaryTree) extends BinaryTree

val n = Node(Node(Leaf(3),Leaf(8)),Leaf(5))

def leafSum(bt:BinaryTree):Int = bt match {
  case Node(left,right) => leafSum(left) + leafSum(right)
  case Leaf(value) => value
}

print( leafSum(n) == 16)
/*******************************/
//扩展使每个节点可以有任意多的后代
sealed abstract class BinaryTree
case class Leaf(value: Int) extends BinaryTree
case class Node(bt:BinaryTree*) extends BinaryTree

val n = Node(Node(Leaf(3),Leaf(5)),Leaf(2),Node(Leaf(5)))

def leafSum(bt:BinaryTree):Int = bt match {
  case Node(bts @ _*) => bts.map(leafSum).sum
  case Leaf(value) => value
}
print( leafSum(n))

/********************************************/
//每个非叶子节点存放操作符
sealed abstract class BinaryTree
case class Leaf(value: Int) extends BinaryTree
case class Node(operator: Char,bt:BinaryTree*) extends BinaryTree

val n = Node('+', Node('*', Leaf(3), Leaf(8)), Leaf(2), Node('-', Leaf(5)))

def eval(bt:BinaryTree):Int = bt match {
  case Node('+',bts @ _*) => bts.map(eval).sum
  case Node('-',bts @ _*) => bts.map(eval).foldLeft(0)(_ - _)
  case Node('*',bts @ _*) => bts.map(eval).product
  case Leaf(value) => value
  case _ => 0
}
print( eval(n))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值