7

IL命令を見たいのです.tailが、私が書いてきた末尾呼び出しを使用した単純な再帰関数は、明らかにループに最適化されています。Reflectorでループがどのように見えるか完全にはわからないので、私は実際にこれを推測しています。しかし、私は間違いなく.tailオペコードを見ていません。プロジェクトのプロパティで[末尾呼び出しの生成]をオンにしました。また、Reflectorでデバッグビルドとリリースビルドの両方を試しました。

私が使用したコードは、ChrisSmithによるProgrammingF#、190ページからのものです。

let factorial x =
// Keep track of both x and an accumulator value (acc)
let rec tailRecursiveFactorial x acc =
    if x <= 1 then
        acc
    else
        tailRecursiveFactorial (x - 1) (acc * x)
tailRecursiveFactorial x 1

誰かが実際に生成するいくつかの簡単なF#コードを提案できます.tailか?

4

1 に答える 1

6

相互再帰関数は次のことを行う必要があります。

let rec even n = 
    if n = 0 then 
        true 
    else
        odd (n-1)
and odd n =
    if n = 1 then 
        true 
    else
        even (n-1)

(今はまだ試していません)。

編集

こちらもご覧ください

F# で関数が末尾再帰的かどうかを確認する方法

于 2010-06-05T07:32:34.870 に答える