【发布时间】:2021-02-03 12:09:10
【问题描述】:
下面是一个简单的sn-p代码,它定义了一个表示链表的Node类和一个将节点添加到链表末尾的方法。在代码中,有两个变量。如何在没有任何变量的情况下编写此代码?
case class Node[A](data: A, var next: Option[Node[A]])
def addNodeToEnd[A](node: Node[A], nodeToAdd: Node[A]): Node[A] = {
if (node.next == None) {
node.next = Some(nodeToAdd)
} else {
var current = node
while ( current.next != None) {
current = current.next.getOrElse(current)
}
current.next = Some(nodeToAdd)
}
node
}
//Test
val node = Node(1, Some(Node(2, Some(Node(3, None)))))
val nodeToAdd = Node(88, None)
println(addNodeToEnd(node, nodeToAdd))
【问题讨论】:
-
好吧,删除方法中的
vars没有多大意义(因为本地突变被认为是性能和可读性没问题),因为数据结构本身是可变的(因为全局可变性是不变性试图解决的真正问题)。 - 但无论如何,只需使用递归,而不是while,只需调用addNodeToEnd(node.next, nodeToAdd) -
如果你还想从 Node 类中删除
var,你基本上是在重新创建一个 List,我可以给你代码它会附加到列表,但您可以在互联网上找到该代码,这是一个非常标准的练习。如果你想学习 Scala 尤其是像不变性这样的 FP 概念,最好自己解决这个问题,诀窍是 recursion,然后 tail-recursion。但是,如果你自己一个人完成这个过程会很困难,我建议你学习一些逐步涵盖所有概念的课程或书籍。 -
只是想看看人们可能采用的各种方法。
-
正如我所说的 recursion 或 tail-recursion,here 你可以看到这两个例子。
-
谢谢!
标签: scala functional-programming