我有一个功能
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'.
我该如何解决这个问题?我想避免变量。
答案 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
你会看到我在更大的函数中定义了实际的递归函数。我相信它会使代码更加清晰。
将while
或for
循环更改为递归函数有很多方法,略有不同,但我想这会向您展示一对一关系如何工作。
当我调用sum 1
btw时,你的代码陷入无限循环。我的编辑崩溃了。
编辑:顺便说一句,做“因子”递归函数的“天真”方法就是这个
let rec recFactorial n =
if n = 1 then 1 else
n * recFactoiral (n-1)
但是,建议不要这样做,并且由于堆栈溢出,将快速崩溃程序。关于Tail Recursion的任何文章(我第一次做的)将解释为什么这比我更好的方式。