ビューティフルコードを読み進める その6。第三章終了

ビューティフルコード (THEORY/IN/PRACTICE)

ビューティフルコード (THEORY/IN/PRACTICE)

長く引っ張ったビューティフルコードの第三章も今日でオシマイ。例3-8は単純に置換。配列を使うようにするだけ。

#include <stdio.h>
#include <stdlib.h>

double t[100];

int main(void)
{
  int i = 0;
  int n = 0;
  double sum;

  t[0] = 0;
  for( n = 1 ; n <= 20 ; n++ ){
    sum = 0.0;
    for( i = 1 ; i <= n ; i++ ){
      sum += n - 1 + t[i-1] + t[n-i];
    }
    t[n] = sum/n;
    printf("n = %d , t[n] = %f\n",n,t[n]);
  }
  return 0;

}

例3-9から例3-11はもう、そのまんま。対称性を使って計算量を減らしましょうというお話。最終的には配列すら使わずに

#include <stdio.h>

int main(void)
{
  double sum = 0.0;
  double t = 0.0;

  int n = 1;
  for( n = 1 ; n <= 30 ; n++ ){
    sum += 2.0*t;
    t = n-1 + sum/n;
    printf("t = %f\n",t);
  }
  return 0;
}

ってコードが導きだされる。

あれ?一番最初はクイックソートをやることではなかったっけ?って言うと、このソースの美しさは見えてこない。本当に解くべき問題は何かということを考え、それに従ってソースをどんどん変えていくのが本章の目的。そのことが分かるのは例3-6から例3-7の行間。ちょっと難しいし、分かりにくいのですけど。

とりあえず、これで第三章はオシマイ。他の章もちまちま読み進めよう。