结束前退出循环

时间:2017-07-18 14:27:26

标签: scala recursion

如何使以下非功能性但简单的代码更具功能性:

def foo2(iSeq: Seq[Int]): Seq[(Int, Boolean)] = {
    var seq = Seq[(Int, Boolean)]()
    iSeq.foreach{ i=>
      println("i = " + i)
      val res = (i,i>=0)
      seq = seq ++ Seq(res)
      if (res._2==false) return seq
    }
    seq
}

代码中的想法是循环给定seq直到第一次测试失败,没有进一步,因为在实际代码中测试是昂贵的。返回的seq应该包含失败之前的所有项目。

代码输出如下:

scala> foo2(Seq(1,2,-3,4))
i = 1
i = 2
i = -3
res3: Seq[(Int, Boolean)] = List((1,true), (2,true), (-3,false))

scala> foo2(Seq(1,2,3,4))
i = 1
i = 2
i = 3
i = 4
res4: Seq[(Int, Boolean)] = List((1,true), (2,true), (3,true), (4,true))

我首先尝试了一下:

  def fooo(iTail: Seq[Int], resSeq: Seq[(Int,Boolean)]): Seq[(Int,Boolean)] = {
    if (iTail.isEmpty) return resSeq
    if (!resSeq.isEmpty && resSeq.last._1<0) return resSeq
    println("i = " + iTail.head)
    val res = (iTail.head,iTail.head>=0)
    val seq = resSeq ++ Seq(res)
    fooo(iTail.tail, seq)
  }

输出是:

scala> fooo(Seq(1,2,3,4,5),Seq())
i = 1
i = 2
i = 3
i = 4
i = 5
res0: Seq[(Int, Boolean)] = List((1,true), (2,true), (3,true), (4,true), (5,true))

scala> fooo(Seq(1,2,-3,4,5),Seq())
i = 1
i = 2
i = -3
res1: Seq[(Int, Boolean)] = List((1,true), (2,true), (-3,false))

所以它有效,但有一个更简洁或&#34; scalaish&#34;编码的方法?

关于性能:代码使用resSeq.last。使用额外的&#34; lastValue&#34;是否更快?递归函数fooo中的参数比使用resSeq.last?

1 个答案:

答案 0 :(得分:1)

那会吗?

Seq(1,2,3).takeWhile( _ < 3)

P.S。谢谢,@ mrmcgreg,我没有读过很高兴。包括第一个失败:

val s = Seq(1,2,3).span( _ < 3)
s._1 ++ s._2.take(1)

P.S。并包括比较值:

val s = Seq(1,2,3).map( e => (e, compare(e)).span( test(_._2))
s._1 ++ s._2.take(1)