1

コンテキスト:大量のテキストから最長の回文を見つけます。

ここに2つの解決策があります。1つは「return」(ネストされた関数から完全に抜け出す)で、もう1つはくだらない「純粋な」答えです。最初のパフォーマンスで純粋なソリューションを作成するにはどうすればよいですか?

  def isPalindrome(str: String) : Boolean = str.reverse == str

  def longestPalindrome(haystack : String) : String = {
    (haystack.length to 1 by -1).foreach{ substrSize =>
      haystack.sliding(substrSize).foreach{ substr =>
        if(isPalindrome(substr))
          return substr
      }
    }
    ""
  }

  def longestPalindrome2(haystack : String) : String = {
    val x = for {
      substrSize <- haystack.length to 1 by -1
      substr <- haystack.sliding(substrSize)
    } yield (substr -> isPalindrome(substr))
    x.find(_._2 == true).map(_._1).getOrElse("")
  }
4

2 に答える 2

3

あなたの質問は、を使用せずに計算を「短絡」する方法であるように思われますreturn。1つの方法は、の非厳密を作成することviewですRange。これが例です、

def palindromeStream(haystack : String) = {
  for {
    substrSize <- (haystack.length to 1 by -1).view
    substr <- haystack.sliding(substrSize)
    if isPalindrome(substr)
  } yield substr
}

val x = palindromeStream("a canal") // Palindromes not yet computed
x.headOption                        // Compute the first one: Some(ana)
x.toSet                             // Compute the rest: Set(n, ana, a, " ", l, c)

あなたも検討するかもしれませんRange.toStream

于 2013-03-06T17:34:01.880 に答える
0

2番目のアプローチのパフォーマンスを少し改善できます。

def longestPalindrome3(haystack: String): String =
    (for {
      substrSize <- haystack.length to 1 by -1
      substr <- haystack.sliding(substrSize)
      if (isPalindrome(substr))
    } yield substr).headOption.getOrElse("")
于 2013-03-06T17:23:03.620 に答える