2016-09-26 2 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:この式の結果は暗黙的に無視されます。この値を明示的に破棄するには、「無視」を使用してください。 '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 

あなたは私が私の大きな関数の中で、実際の再帰関数を定義して表示されます。私はそれがコードをこのようにきれいにすると信じています。

whileまたはforループを再帰関数に変更する方法は多少異なりますが、これは1対1の関係の仕組みを示しています。

sum 1 btwを呼び出すと、コードが無限ループに陥ります。私のエディタをクラッシュしました。

編集:ところで、階乗再帰関数を行うには、「ナイーブ」の方法は、この

let rec recFactorial n = 
    if n = 1 then 1 else 
    n * recFactoiral (n-1) 

であるが、これは推奨されていないとスタックオーバーフローすぐに起因するあなたのプログラムがクラッシュします。テール再帰に関する記事(私が最初にやったこと)は、これがなぜ私ができるよりはるかに良い方法であるのかを説明します。

関連する問題