我试图找出如何使用尾递归返回用户输入的List,然后将此“临时列表”添加到finalList并一次又一次地重试,但出于某种原因,我无法弄清楚为什么我的代码不起作用?
编辑:这是对工作样本解决方案的更新!
val finalList = List[String]()
def exerciseSelector(finalList: List[String]) {
val user = scala.io.StdIn.readLine("choose:")
user match {
case "add" => exerciseSelector(finalListAdd(finalList,addToList(List[String]())))
case "print" => println(finalList) ; exerciseSelector(finalList)
case "stop" => sys.exit()
}
}
def addToList(acc: List[String]): List[String] = {
val input = scala.io.StdIn.readLine("input:")
input match {
case "stop" => acc
case input: String => addToList(input :: acc)
}}
def finalListAdd(acc: List[String], list: List[String]): List[String] = list match{
case Nil => acc
case h :: t => finalListAdd(h :: acc, t)
}
exerciseSelector(finalList)
答案 0 :(得分:1)
我可能错了,我自己没有尝试过,但我猜想public void operation(OpInput opInput)
永远没有机会返回确定的清单。
当您说“停止”时,请在返回addToList
值之前致电exerciseSelector()
。
此外,acc
的结果似乎在某处丢失了。它应该作为finalListAdd
的参数给出,以便能够打印。
你可以试试吗?
exerciseSelector()
def exerciseSelector(finalList: List[String]) {
val user = scala.io.StdIn.readLine("choose:")
user match {
case "add" => exerciseSelector(finalListAdd(finalList,addToList(List[String]())))
case "print" => println(finalList)
case "stop" => sys.exit()
}
}
def addToList(acc: List[String]): List[String] = {
val input = scala.io.StdIn.readLine("input:")
input match {
case "stop" => acc
case input: String => addToList(input :: acc)
}}
def finalListAdd(acc: List[String], list: List[String]): List[String] = list match{
case Nil => acc
case h :: t => finalListAdd(h :: acc, t)
}
exerciseSelector(List[String]())
的变化已经升级到exerciseSelector()
个自我。
finalList作为exerciseSelector()
的参数给出。第一次调用时给出的默认值。
答案 1 :(得分:1)
首先
val tempList = List[String]()
val finalList = List[String]()
没有必要,因为你无法真正添加到这些列表,它们都是不可变的和最终的 val。
finalList
会返回一个List[String]
(据我所知)应该是您要打印的列表。
然而,
的结果case "add" => finalListAdd(finalList,addToList(tempList))
永远不会在任何地方使用。
我不确定具体的要求,但实际上我相信你的代码可以简化为
@tailrec
def exerciseSelector(currentList: List[String]): Unit = {
val user = scala.io.StdIn.readLine("choose:")
user match {
case "stop" => sys.exit()
case "print" =>
println(currentList)
exerciseSelector(currentList)
case "add" => exerciseSelector(currentList)
case input: String => exerciseSelector(input :: currentList)
}
}
exerciseSelector(List.empty)
此处,'add'案例是多余的。
代码将添加任何与列表不匹配的字符串。
在“打印”上,它将打印出当前列表。
只有'停止'它才会退出。