Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使函数递归_.net_Recursion_F#_Functional Programming - Fatal编程技术网

.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)