-2
oops :: Integer -> Integer -> Integer
oops a b
   | a == 0 = b
   | otherwise = oops (a - 1) (b + 1)

oopser :: Integer -> Integer -> Integer
oopser a b
   | a == b = b
   | otherwise = oopser (a + 1) (b - 1)

上記の 2 つの関数は、どの値 a と b に対して終了しますか? 関数が終了すると、a と b の値に対してどの値が返されますか? (両方の機能の質問に別々に答える)...

プログラミングでは、「終了」という言葉を実際にどのように定義しますか??

4

1 に答える 1

2

非終了とは、関数を呼び出し、その関数が値を返すことはなく、永遠にそれを待ち続けることを意味します。今、あなたにとって永遠とは何かを決めることができます ;)。

あなたの特定のケースでは、2つの関数は再帰関数であり、再帰関数が終了するかどうかを知ることは、「基本条件」(つまり、再帰関数がそれ自体を呼び出さない条件)が終了するかどうかを確認することです会ったかどうか。

oops基本条件では isでa == 0あり、再帰では a がデクリメントされるため、-1この関数に as (または負のもの) を渡すと、基本条件を満たさないため、終了しません。正の数またはゼロである任意の a で終了します。

同様に、oopsera より大きい値を渡すと、b は決して終了しません。b より小さい a を渡すか、両方が等しい場合に終了します。

于 2013-06-10T05:03:03.447 に答える