使函数递归

时间:2016-09-26 13:37:42

标签: .net recursion f# functional-programming

我有一个功能

let simpleSum n =
    let s = n * (n+1)/2
    printf "%A " s
let result = simpleSum 10

我现在想让它递归;没有添加变量的尾递归是首选。 我的陈述有问题:if n <= 0 then 0

 let rec recSum n = 
     if n <= 0 then
         0
     else
         recSum n*(n+1)/2
 recSum 4

我遇到了错误:

FS0020: The result of this expression is implicitly ignored. 
Consider using 'ignore' to discard this value explicitly, e.g. 'expr :> ignore',
or 'let' to bind the result to a name, e.g. 'let result = expr'.

我该如何解决这个问题?我想避免变量。

1 个答案:

答案 0 :(得分:2)

我不打算为你做任务。但是,我将向您展示将循环转换为递归函数的常用方法。

这是做“阶乘”的“必要”方式。

let factorial n = 
    let mutable acc = 1
    let mutable iter = 1 
    while iter <= n do 
        acc <- acc * iter
        iter <- iter + 1 
    acc 

这是一个递归实现:

let recFactorial n = 
    let rec loop acc iter = 
        if iter > n then acc else 
        loop (acc*iter) (iter+1) 
    loop 1 1 

你会看到我在更大的函数中定义了实际的递归函数。我相信它会使代码更加清晰。

whilefor循环更改为递归函数有很多方法,略有不同,但我想这会向您展示一对一关系如何工作。

当我调用sum 1 btw时,你的代码陷入无限循环。我的编辑崩溃了。

编辑:顺便说一句,做“因子”递归函数的“天真”方法就是这个

let rec recFactorial n = 
    if n = 1 then 1 else 
    n * recFactoiral (n-1)

但是,建议不要这样做,并且由于堆栈溢出,快速崩溃程序。关于Tail Recursion的任何文章(我第一次做的)将解释为什么这比我更好的方式。