エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

ビジュアルプログラミング(24)

たらい回し関数(1)

たらい回し関数(1) - エレファント・コンピューティング調査報告」で取り扱った「たらい回し関数」も普通にプログラムを書くことができるので、これについても考えてみます。

「たらい回し関数」(TyprScript)は以下のようになります。

var count1: number = 0;
function tarai1(x: number, y: number, z: number): number {
    count1++;
    if (x <= y) {
        return y;
    }
    else {
        var a: number = tarai1(x - 1, y, z);
        var b: number = tarai1(y - 1, z, x);
        var c: number = tarai1(z - 1, x, y);
        return tarai1(a, b, c);
    }
}

これは以下のように書き換えることができます。

var count2: number = 0;
function tarai2(x: number, y: number, z: number): number {
    count2++;
    for (; ;) {
        if (x <= y) {
            return y;
        }
        var a: number = tarai2(x - 1, y, z);
        var b: number = tarai2(y - 1, z, x);
        var c: number = tarai2(z - 1, x, y);
        [x, y, z] = [a, b, c];
    }
}

これは以下のように書き換えることができます。

var count3: number = 0;
function tarai3(x: number, y: number, z: number): number {
    count3++;
    for (var i = 0; i < 2; i++) {
        if (x <= y) {
            return y;
        }
        var a: number = tarai3(x - 1, y, z);
        var b: number = tarai3(y - 1, z, x);
        var c: number = tarai3(z - 1, x, y);
        [x, y, z] = [a, b, c];
    }
    return y; // ここには来ない
}

これは以下のように書き換えることができます。

var count4: number = 0;
function tarai4(x: number, y: number, z: number): number {
    count4++;
    if (x <= y) {
        return y;
    } else if (y <= z) {
        return z;
    } else {
        return x;
    }
}

count1、count2、count3、count4 が有限で、tarai1、tarai2、tarai3、tarai4 の結果が同じになることを示すことができます。