>>551 てか、別に末尾再帰を経なくても全然いい。普通に再帰をループになおせさえすれば。 末尾再帰という形式になった再帰呼び出しのコードは、 ループの形に必ず書き直せるという性質が成り立つだけ。 一応、どういうものかだけ↓に書いておいた。 <<末尾再帰にする前>> function factorial&(byval i%) if i = 0 then factorial = 1 else factorial = i * factorial(i - 1) ' factorial(i - 1)の前に i * という『残りの操作』が残っているので末尾再帰ではない end if end function <<末尾再帰にした後 (別にVBAでは末尾再帰にしても速くなるわけでも最適化されるわけでもない。Lispなら勝手に最適化される)>> function factorial&(byval i%, optional result& = 1) if i = 0 then factorial = result else factorial = factorial(i - 1, i * result) ' 『残りの操作』が残っていないのでこれは末尾再帰 end if end function <<上記をループに書き直した後(VBAでもこういう形にすればスタックなぞ一定量しか要らん)>> function factorial&(byval r%) dim result& dim i% factorial = 1 for i = 1 to r factorial = factorial * i next i end function