教科「情報」の教科書で、よくアルゴリズムの一例として使われる、 2つのコップの果汁の入れ替えを別のコップを介して行う表現、 あれって、イラストが、 何故同じ大きさのコップでは無いのだろうとか、 何故同じ果汁ではないのだろうとか、 以前からずぅっと漠然とした違和感を持っていたので、その話。
同じ大きさのコップ、A、B、が有る。 コップAには、500mlの、 コップBには、350mlの、同じオレンジジュースが入っている。 この2つのコップのジュースの量を入れ替え、 コップAには、350mlの、 コップBには、500mlの、オレンジジュースが入っている状態にしたい。 どうしたら良いだろうか。 コップには目盛りが付いている。
// Swap_1.java 2013.6.23 by Ryn public class Swap_1 { public static void main(String[] args) { int a = 500, b = 350, c; System.out.println("a = " + a + ", b = "+ b); c = a; // ←(1) a = b; // ←(2) b = c; // ←(3) System.out.println("a = " + a + ", b = "+ b); } }
// Swap_2.java 2013.6.23 by Ryn public class Swap_2 { public static void main(String[] args) { int a = 500, b = 350; System.out.println("a = " + a + ", b = "+ b); b = a - b; // b = 500 - 350 = 150 a -= b; // a = 500 - 150 = 350 b += a; // b = 150 + 350 = 500 System.out.println("a = " + a + ", b = "+ b); } }
// Swap_3.java 2013.6.23 by Ryn public class Swap_3 { public static void main(String[] args) { int a = 500, b = 350; System.out.println("a = " + a + ", b = "+ b); b ^= a; a ^= b; b ^= a; System.out.println("a = " + a + ", b = "+ b); } }
確かに実務的には「その1」の方法が、 シンプル、判り易い、確実、なのは間違いがないのですが、 アルゴリズムとしては、違う形のコップ、違う種類のジュースの例にしてしまうと、 「その2」や「その3」への発想にはつながらないだろうなぁ、 と、思うのです。 こだわり過ぎでしょうか。