教科「情報」の教科書で、よくアルゴリズムの一例として使われる、 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」への発想にはつながらないだろうなぁ、 と、思うのです。 こだわり過ぎでしょうか。