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]をつけなかったが、基本的には内部で使う擬似ローカル変数にも全て付けるべきである。
FrontPage
関数一覧
記号一覧
SPALM入門
作品集
自作関数活用術
ダウンロード先
うpロダ
wikiの使い方
SPALMまでの歴史
現行スレ