我不确定如何修改递归方法调用以处理JVMNode列表,我将传递该递归方法以进行检查并替换为其他JVM命令以窥视该语言。每种情况都会在列表中存储一个不同的JVM命令,然后根据需要替换它,以进行优化,然后传递给新的优化列表。
def processSequence(oldlist:List[JVMNode], newlist:List[JVMNode]):List[JVMNode] = {
def listMatch(list: List[Int], newlist:List[JVMNode]): Int = {
list match {
case Nil => currentSum
case x :: xs => listMatch(list[x], newlist[xs])
}
}
listMatch(list, 0)
}
答案 0 :(得分:0)
从您要实现的目标的描述来看,您应该可以使用标准的List
方法来完成您想要的事情。
如果要用另一个节点替换一个JVMNode
,请使用map
并传递一个函数,该函数将旧节点转换为现在优化的新节点(如果没有优化,则返回原始节点)
如果原始列表中的单个JVMNode
可能会产生不同数量的优化节点,请使用flatMap
并传递一个将旧节点转换为新节点列表的函数。
如果要通过依次处理每个JVMNode
来提取单个值,请使用foldLeft
并传递一个初始值和一个基于节点内容更新该值的函数。
如果您确实需要使用递归函数来处理List
,它可能看起来像这样:
def myMap[T](list: List[T], f: T => T): List[T] = {
@annotation.tailrec
def loop(list: List[T], newList: List[T]): List[T] = {
list match {
case Nil => newList.reverse
case x :: xs =>
val newX = f(x)
loop(xs, newX +: newList)
}
}
loop(list, Nil)
}
这与map
相同,但是应该给出如何在List
上构造递归函数的想法。 loop
函数中的代码可以查看List
中的所有节点,以防需要查看节点的上下文。它还可以选择要添加到结果中的节点数,甚至可以根据需要修改以前的节点。
这里要注意两件事:
结果作为参数传递给loop
,因此loop
是尾递归函数,可以进行优化。
以相反的顺序构建结果,然后在末尾反转,因为添加到List
的前面比添加到List
的末尾要快得多。