当前位置: 首页 > article >正文

【scala】含有list子集的递归方法记录层数深度

样例使用scala语言编写。
特点:
RecursiveData对象中包含一个成员child含有多个RecursiveData子对象。

思路:
递归方法中传入一个:int作为parent的深度,传入一个set记录所以深度集合。

同一深度int+1不会影响相同深度的结果,set又可以将统一深度层去重。

容易犯错误:使用单独对象记录,应为是递归是树形结构,随着层数和枝叶增加,会多计算,如recWrong方法就是错误典型。

import org.scalatest.funsuite.AnyFunSuite

import java.util.concurrent.atomic.AtomicInteger
import scala.collection.mutable

case class RecursiveData(name: String, child: List[RecursiveData])

class RecursiveTest extends AnyFunSuite {

  val r41 = RecursiveData("41", List.empty)
  val r42 = RecursiveData("42", List.empty)
  val r43 = RecursiveData("43", List.empty)
  val r44 = RecursiveData("44", List.empty)
  val r31 = RecursiveData("31", List(r41, r42))
  val r32 = RecursiveData("32", List(r43, r44))
  val r33 = RecursiveData("33", List.empty)
  val r34 = RecursiveData("34", List.empty)
  val r35 = RecursiveData("35", List.empty)
  val r36 = RecursiveData("36", List.empty)
  val r37 = RecursiveData("37", List.empty)
  val r21 = RecursiveData("21", List(r31, r32, r33))
  val r22 = RecursiveData("22", List(r34, r35))
  val r23 = RecursiveData("23", List(r36, r37))
  val r11 = RecursiveData("11", List(r21, r22, r23))

  def rec(data: RecursiveData, parentDepth: Int, depths: mutable.Set[Integer]): Unit = {
    val currDepth = parentDepth + 1
    depths.add(currDepth)
    data.child.foreach(c => {
      rec(c, currDepth, depths)
    })
  }

  test("test-recursive-right") {
    val depths: mutable.Set[Integer] = mutable.Set.empty
    rec(r11, 0, depths)
    println(s"current depths:${depths},and max depths:${depths.max}")
    // current depths:Set(1, 2, 3, 4),and max depths:4
  }

  def recWrong(data: RecursiveData, depth: AtomicInteger): Unit = {
    data.child.foreach(c => {
      recWrong(c, depth)
    })
    if (data.child.nonEmpty) {
      // 错误思路: 每次增加减去相应的子成员增加量
      depth.set(depth.get() - (data.child.size - 1))
    }
    depth.getAndIncrement()
  }

  test("test-recursive-wrong") {
    val depth: AtomicInteger = new AtomicInteger
    recWrong(r11, depth)
    println(depth)
    // 7
  }
}

http://www.kler.cn/a/504672.html

相关文章:

  • Vue.js组件开发-使用地图绘制轨迹
  • Node.js - HTTP
  • 导出文件,能够导出但是文件打不开
  • 【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)
  • 金融项目实战 02|接口测试分析、设计以及实现
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>优美的排列
  • 算法分析与设计之贪心算法
  • 基于pysptools实现端元提取及无监督光谱分类
  • Flink (五) :DataStream API (二)
  • 将内部部署系统的端口暴露给外部访问,并且仅允许指定 IP 的服务器访问该端口
  • 线上资源访问本地数据-跨域问题总结
  • 在eNSp上telnet一下吧
  • ubuntu下安装Mysql 以及3306端口被占用解决方法
  • Kibana操作ES基础
  • 学习AI大模型的小白入门建议和具体的学习方法推荐
  • 【python】OpenCV—Extract Horizontal and Vertical Lines—Morphology
  • 【学习笔记】Macbook管理多个不同的Python版本
  • 初学者如何用 Python 写第一个爬虫?
  • 1.15学习
  • elementUI项目中,只弹一个【token过期提示】信息框的处理
  • Vue中nextTick实现原理
  • 鸿蒙心路旅程:HarmonyOS NEXT 心路旅程:技术、成长与未来
  • 探索文本相似性算法:解锁文本比对的奥秘
  • 数据结构-ArrayLIst-一起探索顺序表的底层实现
  • 二手车交易系统的设计与实现(代码+数据库+LW)
  • 抖音ip属地没有手机卡会显示吗