从String中递归地删除元音

时间:2016-02-26 15:01:10

标签: scala recursion

我想知道为什么会出现编译错误,以及如何纠正错误:

<form action="https://reel-guiding-development.s3.amazonaws.com" method="post" enctype="multipart/form-data">
  <input type="hidden" name="key" value="[redacted]" />
  <input type="hidden" name="success_action_status" value="201" />
  <input type="hidden" name="acl" value="public-read" />
  <input type="hidden" name="policy" value="[redacted]=" />
  <input type="hidden" name="x-amz-credential" value="[redacted]" />
  <input type="hidden" name="x-amz-algorithm" value="AWS4-HMAC-SHA256" />
  <input type="hidden" name="x-amz-date" value="20160226T143447Z" />
  <input type="hidden" name="x-amz-signature" value="dfe48736cdf600f90181019792835c991df089a4c8c1942fe40c8ed1fa11a80e" />

  <input type="file" name="file" />

  <input type="submit" />
</form>

Scala工作台工作表抱怨for循环属于def stripVowelsRecursive(str: String): Char = { if(str.length() == 0) ' ' else for(ch <- str) { if(isVowel(ch)) ch else ' ' +stripVowelsRecursive(str.tail) } } 类型,而它期望Unit

顺便说一下,我本来是这样编写的,但是我需要明白我上面做的错误,因为Char语句的两个分支都返回一个Char:

if

3 个答案:

答案 0 :(得分:1)

代码中的麻烦:

  1. 因为Kolmar在yield
  2. 之后提到失踪for
  3. a + b如果{\ 1}}和a都是字符,则结果是Java \ Scala中的b,而不是连接字符串
  4. 您正尝试在Int中混合显式for循环和递归,您必须选择一个
  5. 可能的解决方案:

    else

答案 1 :(得分:1)

我想我知道你在做什么。问题是你试图循环你的算法,而不是让递归为你做循环。看看这个:

  def stripVowelsRecursive(str: String): String = {
    if (str.length == 0) ""
    else {
      if (isVowel(str.head)) " " + stripVowelsRecursive(str.tail)
      else str.head.toString + stripVowelsRecursive(str.tail)
    }
  }
  • 返回类型必须从Char更改为String,以便您可以使用字符串的tail递归调用该函数。
  • 递归路径需要评估字符串的head并将递归应用于其tail
  • 不确定为什么要在基础案例中创建另一个空字符串。将其更改为空字符串

答案 2 :(得分:-1)

这是因为你的其他人不会返回一个字符,而是一个Unit。返回类型为Unit的方法类似于声明为void的Java方法。 ifelse都返回字符,但for循环没有,这就是你的问题。除此之外,您的else广告正在返回String而不是Char,因为String.tail会返回StringChar + String结果String 1}}。

使用递归的正确解决方案是:

def stripVowelsRecursive(str: String): String = {
  if (str.length() == 0) str
  else {
    val head: Char = str.head
    val tail: String = str.tail

    if(isVowel(head)) stripVowelsRecursive(tail)
    else head + stripVowelsRecursive(tail)
  }
}

第二个示例(yield)有效,因为它是sequence comprehensions,而yield块负责返回值,而不是forif