Scala 解释为什么encode方法返回空向量
我希望此代码返回Scala 解释为什么encode方法返回空向量,scala,Scala,我希望此代码返回Seq(List(a,2),List((a,2),(e,1)),List((a,2),(e,1),(t,1)),但它返回一个空的向量: val ws: List[(Char,Int)] = List((a,2), (e,1), (t,1)) def encode(ws: List[(Char,Int)]): Seq[List[(Char,Int)]] = for { split <- (1 to ws.length) wst <- ws.take
Seq(List(a,2),List((a,2),(e,1)),List((a,2),(e,1),(t,1))
,但它返回一个空的向量
:
val ws: List[(Char,Int)] = List((a,2), (e,1), (t,1))
def encode(ws: List[(Char,Int)]): Seq[List[(Char,Int)]] =
for {
split <- (1 to ws.length)
wst <- ws.take(split)
wdt <- encode(ws.drop(split))
} yield wst::wdt
valws:List[(Char,Int)]=List((a,2)、(e,1)、(t,1))
def编码(ws:List[(Char,Int)]):Seq[List[(Char,Int)]]=
为了{
拆分快速生成所需输出的一条直线
你真正想要的似乎是:
println(ws.inits.toList.reverse.tail)
// output:
// List(List((a,2)), List((a,2), (e,1)), List((a,2), (e,1), (t,1)))
为什么向量为空?
以某种方式,参数ws
的长度在递归调用期间会减少(因为在递归调用encode
之前至少会删除一个元素)
一旦ws
的长度达到零,则ws.take
-生成器将变为空,因此您的for
-表达式将变为空
本质上
(1 to someNumber).flatMap(_ => Nil)
由于范围
在映射/flatMapping之后生成一个向量
,因此您获得一个空的向量()
,然后返回该向量
长递归解决方案
如果您(出于任何原因)坚持使用递归,您可以这样做:
val ws: List[(Char,Int)] = List(('a',2), ('e',1), ('t',1))
def encode(ws: List[(Char,Int)]): Seq[List[(Char,Int)]] =
if (ws.isEmpty) {
Nil
} else {
encode(ws.dropRight(1)) ++ List(ws)
}
println(encode(ws))
// output:
// List(List((a,2)), List((a,2), (e,1)), List((a,2), (e,1), (t,1)))
这就是正确的递归通常应该是什么样子:您分别处理Nil
-情况和非空列表情况,而不是依赖于奇怪的flatMap
s,因为它们没有东西可供迭代
请注意,此解决方案效率不高,最好创建一个助手方法并反转输入。快速生成所需输出的一行程序
你真正想要的似乎是:
println(ws.inits.toList.reverse.tail)
// output:
// List(List((a,2)), List((a,2), (e,1)), List((a,2), (e,1), (t,1)))
为什么向量为空?
以某种方式,参数ws
的长度在递归调用期间会减少(因为在递归调用encode
之前至少会删除一个元素)
一旦ws
的长度达到零,则ws.take
-生成器将变为空,因此您的for
-表达式将变为空
本质上
(1 to someNumber).flatMap(_ => Nil)
由于范围
在映射/flatMapping之后生成一个向量
,因此您获得一个空的向量()
,然后返回该向量
长递归解决方案
如果您(出于任何原因)坚持使用递归,您可以这样做:
val ws: List[(Char,Int)] = List(('a',2), ('e',1), ('t',1))
def encode(ws: List[(Char,Int)]): Seq[List[(Char,Int)]] =
if (ws.isEmpty) {
Nil
} else {
encode(ws.dropRight(1)) ++ List(ws)
}
println(encode(ws))
// output:
// List(List((a,2)), List((a,2), (e,1)), List((a,2), (e,1), (t,1)))
这就是正确的递归通常应该是什么样子:您分别处理Nil
-情况和非空列表情况,而不是依赖于奇怪的flatMap
s,因为它们没有东西可供迭代
请注意,此解决方案的效率不是很高,最好创建一个helper方法并反转输入。它不会返回任何内容。即使您修复了“a”、“e”、“t”,它仍然会与光荣的java.lang.StackOverflowerError
一起崩溃。请使用导致问题方法参数的确切代码更新您的问题er被命名为wsi2,但内部使用的是ws(3次)。您知道在发布之前可以在REPL中运行代码吗?函数param中的wsi2
变量有什么用?键入错误。参数应该是wsIt,它不会返回任何内容。即使您修复了“a”、“e”、“t”,它仍然会与光荣的java.lang.StackOverflower
崩溃。请使用确切的代码w更新您的问题导致问题的方法参数名为wsi2,但内部使用的是ws(3次)。您知道可以在发布前在REPL中运行代码吗?函数param中的wsi2
变量有何用途?键入错误。参数应为wsThanks以获取解释。这有助于理解程序逻辑。感谢您的解释。这有助于理解程序逻辑。