2016-09-26 94 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) 

然而,這不是推薦的迅速崩潰因堆棧溢出程序。任何關於尾遞歸的文章(我第一次做的)都會解釋爲什麼這會比我更好。