在Scala中如何减少for循环的使用?

11

第一天尝试使用Scala - 请对我宽容点!我试图重写一些旧的Java代码,这只是一个接受两个数字并打印出从x到y的数字的函数。例如,我有增量函数:

    def increment(start: Int, finish: Int) = {
      for (i <- start to finish) {
         println("Current value (increasing from "+start+" to "+finish+") is "+i)
      }
    }

然而,我正在努力编写一个相应的递减函数,它将从开始到结束递减?我已经阅读了Scala downwards or decreasing for loop?,但仍不确定。

谢谢

8个回答

18
scala>def decrement(start: Int, finish: Int) = {
    |  for (i <- start to finish by -1)
    |   println("Current value (decreasing from "+start+" to "+finish+") is "+i);
    | }
decrement: (start: Int,finish: Int)Unit

scala> decrement(10, 1)
Current value (decreasing from 10 to 1) is 10
Current value (decreasing from 10 to 1) is 9
Current value (decreasing from 10 to 1) is 8
Current value (decreasing from 10 to 1) is 7
Current value (decreasing from 10 to 1) is 6
Current value (decreasing from 10 to 1) is 5
Current value (decreasing from 10 to 1) is 4
Current value (decreasing from 10 to 1) is 3
Current value (decreasing from 10 to 1) is 2
Current value (decreasing from 10 to 1) is 1

非常感谢。我现在不知道为什么我没有从https://dev59.com/oXE85IYBdhLWcg3wx2j2?answertab=votes#tab-top看到那个。显然我没有想清楚! - rwb
还有一件事 - 抱歉。我该如何在println中获取迭代器的值? - rwb
"start to finish by -1" 将返回一个 Range,您可以对其进行迭代。 - dacwe
有没有办法以函数式的形式编写这个函数? - rwb
1
def dec(start: Int, finish: Int) = { start to finish by -1 }; dec(10, 1).foreach( i => println("decrementing " + i) ); - dacwe
@Ryan 函数式编程:def dec(from:Int, to:Int):Int = if( from > to) dec(from-1,to) else to (递归是“函数式”的,你懂的) - AndreasScheinert

6
for (i <- (6 to 3 by -1)) {println ("i: " + i)}
i: 6
i: 5
i: 4
i: 3

如果你不小心忘记了 by -1,你可以向上移动并使用一个函数来恢复结果:
for (i <- (3 to 6)) {println ("i: " + ((6+3) - i))}

为了排除第二个边界,请使用until:
for (i <- (6 until 3 by -1)) {println ("i: " + i)}
i: 6
i: 5
i: 4

或者您可以为您的目的定义一个迭代器。扩展迭代器很容易; 只需实现“hasNext:Boolean”和“Next:[T]”,其中T是要处理的类型-在我们的例子中为Int或可能为Long或BigInt:

class FromToIterator (start: Int, stop: Int) extends Iterator [Int] { 
  var current = start
  //                        3       6       3         6         6       3       6         3
  def hasNext : Boolean = ((start < stop && current <= stop) || (start > stop && current >= stop)) 
  def next: Int = { 
    val res = current
    if (start < stop) current += 1 else current -= 1
    res
  } 
}
val it = new FromToIterator (3, 6)
val ti = new FromToIterator (6, 3)

for (i <-it) println (i)
for (i <-ti) println (i)

谢谢。我不知道by -X存在。 - Felipe

2
这样,您可以在Scala中使用递减for循环。
    object Example extends App {


      for(i <- 20 to 2 by -2){


        println("Value of i = "+ i)

      }
    }
------------------
O/P
------------------
Value of i = 20
Value of i = 18
Value of i = 16
Value of i = 14
Value of i = 12
Value of i = 10
Value of i = 8
Value of i = 6
Value of i = 4
Value of i = 2

1

从高数到低数每次减1(与其他负或正步长交换以改变步进)

def decrement(start: Int, finish: Int) = {
  for (i <- start to finish by -1) {
     println("Current value (decreasing from "+start+" to "+finish+") is "+i)
  }
}

我认为这是Scala向下或递减的循环?的重复。


0
object Test extends App{

  def decrement(start: Int, finish: Int,dec :Int) = {
    for (i <- Range(start,finish,dec)) {
      println("Current value (decreasing from "+start+" to "+finish+") is "+i)
    }
  }

  decrement(5,0,-1)
}

这也是一种方法,但可能不是最好的。


0

值得补充的一点是,如果你像这样做

for(j <- finish to start){......}

sbt甚至不显示错误。因此,如果您想要一个递减的for循环,您需要这样做

for(j <- finish to start by -1){.......}

0
def printInDecreasingOrder(start : Int, end : Int){
  if(start > end ){
     for(i <- start to end by -1){
       println(s"Current value (decreasing from $start to $end) is $i")
     }
   }else{
     println("first num is smaller than second")
   }
}

方法调用:

printInDecreasingOrder(10, 2)

结果:

当前值(从10到2递减)为10

当前值(从10到2递减)为9

当前值(从10到2递减)为8

当前值(从10到2递减)为7

当前值(从10到2递减)为6

当前值(从10到2递减)为5

当前值(从10到2递减)为4

当前值(从10到2递减)为3

当前值(从10到2递减)为2

printInDecreasingOrder(1, 10)

结果:

第一个数字比第二个小


0

这是受到Scala下降或递减的循环?启发的全局增量/减量解决方案:

def goThrough(start: Int, finish: Int) = {     
  val d = if(start<=finish) 1 else -1
  for (i <- start to finish by d) {
    println("Current value (increasing from "+start+" to "+finish+") is "+i)
  } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接