.net 使函数递归
我有一个函数.net 使函数递归,.net,recursion,f#,functional-programming,.net,Recursion,F#,Functional Programming,我有一个函数 let simpleSum n = let s = n * (n+1)/2 printf "%A " s let result = simpleSum 10 我现在想让它递归;首选不添加变量的尾部递归。 我的陈述有点不对劲:如果n我不会为你做作业。但是,我将向您展示将循环转换为递归函数的常用方法 这是做阶乘的“必要”方法 let factorial n = let mutable acc = 1 let mutable iter = 1
let simpleSum n =
let s = n * (n+1)/2
printf "%A " s
let result = simpleSum 10
我现在想让它递归;首选不添加变量的尾部递归。
我的陈述有点不对劲:
如果n我不会为你做作业。但是,我将向您展示将循环转换为递归函数的常用方法
这是做阶乘的“必要”方法
let factorial n =
let mutable acc = 1
let mutable iter = 1
while iter <= n do
acc <- acc * iter
iter <- iter + 1
acc
您将看到我在更大的函数中定义了实际的递归函数。我相信这样会使代码更干净
有许多不同的方法可以将while
或for
循环更改为递归函数,但我认为这说明了一对一关系的工作原理
当我调用sum1
btw时,你的代码陷入无限循环。我的编辑器崩溃了
编辑:顺便提一下,做阶乘递归函数的“天真”方法是
let rec recFactorial n =
if n = 1 then 1 else
n * recFactoiral (n-1)
但是,不建议这样做,因为堆栈溢出会使程序很快崩溃。任何关于尾部递归的文章(我第一次做的)都会解释为什么这比我能做的更好。什么不起作用?您遇到了什么错误/问题?while循环有什么意义?在哪种情况下,结果会有什么不同,而不仅仅是让sum n=n*(n+1)/2
?我知道while循环是不必要的,但在我的作业中是一项要求。我遇到错误:FS0020:隐式忽略此表达式的结果。考虑使用“忽略”来明确地丢弃这个值,例如“EXPR:>忽略”,或者“让”将结果绑定到一个名称,例如“让结果= ExPR”。我想在这里避免变量。你确定没有误解你的作业吗?您可以使用循环/递归计算总和,也可以使用公式。同时做这两件事毫无意义。第一个任务是使用循环。第二个任务是使用递归。现在我只是想让递归工作。总和应该是一样的。
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
let rec recFactorial n =
if n = 1 then 1 else
n * recFactoiral (n-1)