擬似再帰


擬似再帰

SPALMにはローカル変数がないので、階乗計算を単に以下のように作っても

func fact(x){
if(x>0){
ret=fact(x-1)*x
}else{
ret=1
}
return ret
}

実行結果は
fact(5) = 0

となる。呼び出しをするたびにx=x-1が実行され、0になったら1を返すが返り値に結局x=0をかけているので
0になってしまうのだ。しかしSPALMの仮引数には以下のような記述が許されている。
func fact(x[d]){〜}

ただし[]の中身は変数か数字1つまでで、式などは書けない。これにより擬似的に再帰を書くと

func fact(x[d]){
if(x[d]>0){
ret=fact(x[d++]-1)*x[d]
}else{
ret=1
}
--d
return ret
}

呼び出し時に深度dを1増やしx[d+1]=x[d]となるような引数渡しを行っている。また、関数からリターンする時に--d
としておくことで一つ前の関数の状態が復元される。これを使えば、ぷよぷよの消滅判定などにも応用できる。
今回は引数にしか[d]をつけなかったが、基本的には内部で使う擬似ローカル変数にも全て付けるべきである。