2
fun temp(x) = 
let val a = x
in if a mod (x-1) = 0 then x
   else temp(x-1)
end;

これは標準 ML コードの例です。

私が知りたいのは、たとえばユーザーが temp(10); を呼び出すことです。a = 10 となり、temp(x-1) が呼び出されます。

その後、変数 'a' は 9 に変更されます。標準 ML で 10 のままにできますか?

4

1 に答える 1

3

関数に が含まれている場合、val a = xを呼び出すとtemp(x)、 の値は の値aと等しくなりますx。再帰するときに以前の呼び出しからの値を覚えておきたい場合はa、次のようにパラメーターとして渡す必要があります。

fun temp_helper x a =
  if a mod (x-1) = 0 then x
  else temp_helper (x-1)

fun temp x = temp_helper x x

ヘルパー関数を内部関数にすることもできます。そうする場合、実際にaはパラメーターとして削除し、代わりに次のaように閉じることができます。

fun temp x =
let
  val a = x
  fun helper x =
    if a mod (x-1) = 0 then x
    else helper (x-1)
in
  helper x
end
于 2012-09-11T21:30:57.843 に答える