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までの歴史
現行スレ