【问题标题】:Decreasing for loop in Scala?减少Scala中的for循环?
【发布时间】:2012-04-02 13:00: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? 但仍不确定

谢谢

【问题讨论】:

    标签: scala


    【解决方案1】:
    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
    

    【讨论】:

    • 非常感谢。我现在不知道我怎么没有从stackoverflow.com/questions/2617513/… 看到这一点,绝对不是直截了当!
    • 还有一件事 - 抱歉。我如何获得 println 中迭代器的值?
    • start to finish by -1 将返回一个Range,您可以对其进行迭代。
    • 有没有办法把这个函数写成函数形式?
    • def dec(start: Int, finish: Int) = { start to finish by -1 }; dec(10, 1).foreach( i =&gt; println("decrementing " + i) );
    【解决方案2】:
    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 存在
    【解决方案3】:

    这样您就可以在 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
    

    【讨论】:

      【解决方案4】:

      highnum to lownum by -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 downwards or decreasing for loop?的欺骗

      【讨论】:

        【解决方案5】:

        这是一个受Scala downwards or decreasing for loop?启发的全局递增/递减解决方案:

        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)
          } 
        }
        

        【讨论】:

          【解决方案6】:
          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)
          }
          

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

          【讨论】:

            【解决方案7】:
            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)

            结果:

            第一个 num 小于第二个

            【讨论】:

              【解决方案8】:

              如果您这样做,请在此答案中添加一点

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

              sbt 甚至没有显示错误。所以如果你想要一个递减的 for 循环,你需要这样做

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-02-06
                • 2011-12-22
                • 2011-10-29
                • 1970-01-01
                • 2017-07-22
                • 2018-03-27
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多