【问题标题】:Replacing while loop with idiomatic functional style用惯用的功能样式替换 while 循环
【发布时间】:2017-04-08 02:27:18
【问题描述】:

下面的代码演示了两种求和值的方法,如果值达到 5,则终止条件:

   object ob extends App {

        def withoutRecursion = {

            var currentTotal = 0.0;

            while(5 > currentTotal){

                currentTotal = currentTotal + scala.util.Random.nextFloat
                println(currentTotal);

            }

        }

        def withRecursion = {

            var currentTotal = 0.0;

            def whileLoop(cond : =>Boolean)(block : =>Unit) : Unit =
                if(cond) {
                    block
                    whileLoop(cond)(block)
                }

            whileLoop(5 > currentTotal) {
                currentTotal = currentTotal + scala.util.Random.nextFloat
                println(currentTotal);
            }

      }

    }

在这种情况下,withRecursion 方法是用函数式编程风格替换 while 循环的惯用方法吗?

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    不是真的。在您的示例中,您仍在使用 var 来收集中间结果。这不是很FP。

    一个(许多)选项是创建一个无限但懒惰的Stream 来重复必要的计算。然后,如果你想要所有的中间值,你 takeWhile(),或者如果你只想要最终结果,你 dropWhile()

    例子:

    Stream.iterate(0F)(_ + util.Random.nextFloat).takeWhile(_ < 5)
    

    这将创建一个有限的Stream,其所有值从 0.0 到最大和小于 5。

    另一方面...

    Stream.iterate(0F)(_ + util.Random.nextFloat).dropWhile(_ < 5).head
    

    ...这将为您提供大于 5 的第一个结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2021-07-27
      • 2019-08-18
      • 1970-01-01
      • 2021-05-03
      • 2011-03-26
      相关资源
      最近更新 更多