使用while循环的F#阶乘函数

问题描述

我已收到一项作业,要求执行以下操作:

编写函数 sum:n:int-> int 它使用计数器值,局部可变值s和while循环来计算 将1 + 2 +··+ n取为(2)。如果以小于1的任何值调用函数,则为 返回值0。

现在,我知道您可以使用match来创建递归阶乘脚本,但是我不太想知道如何使用while循环来做到这一点。

感谢您的帮助。

解决方法

由于这是一个分配问题,我不会仅给出解决方案来回答,但我认为这将帮助您看到一个简短的代码片段,其中显示了您需要组合的所有结构:

let imperativeDemo y = // Define a function taking 'y' as an argument
  let mutable x = y    // Create a mutable variable 'x' initialized to 'y'
  while x < 20 do      // Loop while 'x' is less than 20
    x <- x + 1         // Mutate 'x' - increment it by one
  x                    // Return the final value of 'x'

此功能对无用没有任何作用,但应该易于调整以实现阶乘函数所需的逻辑。

,

这将对前n个整数进行求和(这不是阶乘函数!):

let sum n = 
    let mutable s = 0
    let mutable counter = n
    while counter > 0 do
        s <- s + counter
        counter <- counter - 1
    s

为比较起见,尾递归版本:

let sumRec n = 
    let rec sumRecInner n accu = 
        if (n <= 0) then accu else
            sumRecInner (n - 1) (n + accu)
    sumRecInner n 0