Think Stitch
PRINCIPIA  最近の更新


不思議な計算ループ

先ほど Twitter で「#みんなどうやってプログラミング覚えたの」というハッシュタグ見かけたので(参加したので)、ちょっと書きたくなりました。 (言葉の使い方はあっていますかね?。Twitter 初心者なのでおかしなことを言っていないかドキドキします。実は酒が入っているからだという話もあるんですが。)

プログラミングを覚えたのははるか昔なんですけど、いままで見てきた本の中で、プログラムの書き方を説明している本は2冊しか見たことがありません。

「そんなわけはない。本屋に行けばプログラミングの解説書は山積みされているだろう」とおっしゃるかもしれません(またこれだよといわないでください^^;)。 でもちょっと思い返してみてください。「プログラムをどうやって書くか」ということを説明している本はありますか?。 プログラミング言語の要素の説明とか、ライブラリの関数やシステムコールの説明、プログラムの例が載っている本はたくさんあるでしょう。 しかしどうやって書くかという手順というか考え方、方法を説明している本ってありましたか?

私は2冊だけ知っています。 1つは前にも紹介したと思いますが The Science of Programming(邦訳:プログラミングの科学)です。 もう1つは Dijkstra さんと Feijen さんの書いた A METHOD OF PROGRAMMING(邦訳:プログラミングの方法)です。 いま調べたところ、残念ながら The Science of Programming の原書以外は手に入らないようです。 ここで紹介する本はいつも手に入らないというか、紹介すると手に入らなくなるというか、ほんとすみません。 しかも、これだけ前ふりしておいて、中身の話はしません(またこれかよといわないでください)。 興味が会ったらぜひ見つけて読んでみてください。 プログラムの書き方が説明されていますよ。

ここで紹介したいのは、プログラミングの方法に出ている不思議なループについてです。 前置きなし(十分した)で見てください。 これはいったい、何を計算しているのでしょうか。

/* precondition: n >= 0 */
int mystery(int n, int *p)
{
    int q, r, x, y;

    r = n + 1;
    q = 0;
    while (r >= 4) {
        x = r / 4;
        y = r % 4;
        q = q + x;
        r = x + y;
    }
    *p = r - 1;
    return q;
}

解答編はそのうち書きます。:P

2013/08/28

2つの値 q と r - 1 を返すように修正しました。酔っぱらいはだめですね。(2013/08/29 修正)

解答編を書きました。(2013/08/30 追記)

© 2013,2014,2015 PRINCIPIA Limited