2016-09-26 52 views
2

我有一个函数制作函数的递归

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

什么不工作?你遇到什么错误/问题? – mosca125

+0

while循环有什么意义?在这种情况下,结果会不同于'let sum n = n *(n + 1)/ 2'吗? – sepp2k

+0

while循环没有必要我知道,但是在我的任务中是一个要求。 我遇到了错误: FS0020:该表达式的结果被隐式忽略。考虑使用'ignore'来明确地丢弃这个值,例如'expr:> ignore''或'let'将结果绑定到名称,例如'let result = expr'。 我想在这里避免变量。 – kthonenice

回答

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) 

然而,这不是推荐的迅速崩溃因堆栈溢出程序。任何关于尾递归的文章(我第一次做的)都会解释为什么这会比我更好。