Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 解释为什么encode方法返回空向量_Scala - Fatal编程技术网

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以获取解释。这有助于理解程序逻辑。感谢您的解释。这有助于理解程序逻辑。