さて、次は再帰呼び出しを関数に展開したもので、事前メモリ確保した場合を実測しよう。
まずはCの場合を書き換えてみる。2004.05.06付のソースコードと同様に、以下に掲載しておく。
long expand11(long array[]) {
int i, j, k, l;
long value = 0;
long *subarray = array_buf[9];
for(i = 0; i < 11; ++i) {
l = 0;
for(j = 0; j < 11; ++j){
if(j != i){
for(k = 1; k < 11; ++k)subarray[(l * 10) + k - 1] = array[(j * 11) + k];
++l;
}
}
if(i % 2 == 0){
value += (array[i * 11] * expand10(subarray));
}else{
value -= (array[i * 11] * expand10(subarray));
}
}
return value;
}
mallocでメモリを確保していた部分を、事前に確保しておいた配列への参照に置き換えた。あとは同じである。
ちなみに、expand01 のソースコードは全く同じになる。
long expand01(long array[]) {
return array[0];
}
では次回、この実測を行ってみる。