0
fun isfib(a) =
   findfib(a,1,1)

and
findfib(b,x,y) =
   val z = x + y
   if b <= 1 then true
   else if z > b then false
   else if z = b then true
   else fib(b,y,z)

プログラムに入力を入れて、この入力が心房細動の数値であるかどうかを再帰的に調べようとしています。別のプログラムでfibのx番目の場所を2行で計算できます。しかし、この「入力、fibと等しいかどうかの確認、fibを無限大またはバストにする」ロジックは、私には非常に混乱します。また、7.1行目(B <= 1)で「ANDをANDALSOに置き換える」や「ORELSEを挿入する」などのエラーが発生します。

4

1 に答える 1

0

つまりand、相互再帰が必要な場合に使用する必要があります。この場合、実際にはそうではないようです。たとえば、次のようなことを試すことができます。

fun fib 0 = 1
    | fib 1 = 1
    | fib n = (fib (n-1)) + (fib (n-2));

fun isfib a = 
    let
        fun eval a b = if a = (fib b) then true else if a < (fib b) then false else eval a (b+1)
    in
        eval a (1)
end;

たとえば、実行isfib 5してみてください。isfib 6無限大は必要ありません。

于 2013-02-14T01:05:06.530 に答える