さて、次は再帰呼び出しを関数に展開したもので、事前メモリ確保した場合を実測しよう。
まずは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]; }
では次回、この実測を行ってみる。