GAIさんへのお返事です。
> じゃーこれは一体どのようにして計算されたものであるのか?
漸化式をそのまま記述すれば
!分割数(partition number)
FUNCTION p(n,k)
IF k=1 OR k=n THEN !p(n,1)=p(n,n)=1
LET p=1
ELSEIF n<k THEN !p(n,k)=p(n-k,k)+p(n-1,k-1)
LET p=0
ELSE
LET p=p(n-k,k)+p(n-1,k-1)
END IF
END FUNCTION
FOR i=1 TO 30 !1~30まで
LET pn=0
FOR k=1 TO i !p(n)=Σ[k=1,n]p(n,k)
LET pn=pn+p(i,k)
NEXT k
PRINT i; pn
NEXT i
END
組合せ(comb(n,r))やフィボナッチ数列なども再帰関数で計算できます。
ただ、毎回最初に戻って値を確定するので、nが多くなると負荷がかかります。
(遅くなるし、システム領域がなくなる(スタックオーバーフローが発生する)
表計算のように結果を残しながら、nを1から順に求めるのがいいでしょう。
(計算は速いが、メモリは浪費する)
参考 パスカルの三角形
!分割数(partition number)
LET N=30
DIM p(N,N) !左下充填の行列をつくる
MAT p=ZER !n<kならp(n,k)=0
FOR i=1 TO N
LET p(i,1)=1 !p(n,1)=1
LET p(i,i)=1 !p(n,n)=1
NEXT i
FOR i=1 TO N !左上から順に計算していく
FOR k=2 TO i-1
LET p(i,k)=p(i-k,k)+p(i-1,k-1) ! !p(n,k)=p(n-k,k)+p(n-1,k-1)
NEXT k
NEXT i
MAT PRINT USING(REPEAT$(" ####",N)): p !debug
FOR i=1 TO N !1~Nまで
LET pn=0 !p(n)=Σ[k=1,n]p(n,k)
FOR k=1 TO i
LET pn=pn+p(i,k) !列の和
NEXT k
PRINT i; pn
NEXT i
END
※計算の都合上、提示された漸化式の行と列を入れ替えています。(転置)
> オイラーの五角数定理だの母関数だのと解説されているが、
!分割数(オイラーの五角数定理)
LET N=30
DIM a(0 TO N),p(0 TO N)
MAT a=ZER
MAT p=ZER
LET i=0
LET j=i*(3*i-1)/2
DO
IF MOD(i,2)=1 THEN !奇数なら
LET a(j)=a(j)-1
ELSE !偶数なら
LET a(j)=a(j)+1
END IF
LET i=i+1
LET j=i*(3*i-1)/2
LOOP WHILE j<=N
LET i=0
LET j=i*(3*i+1)/2
DO
IF MOD(i,2)=1 THEN !奇数なら
LET a(j)=a(j)-1
ELSE !偶数なら
LET a(j)=a(j)+1
END IF
LET i=i+1
LET j=i*(3*i+1)/2
LOOP WHILE j<=N
LET p(0)=1
FOR i=1 TO N
FOR j=0 TO i-1
LET p(i)=p(i)-p(j)*a(i-j)
NEXT j
NEXT i
FOR i=0 TO N !結果を表示する
PRINT i; a(i); p(i)
NEXT i
END