【マトリックス】変数aとbを入れ替えるのに、cは要るのか問題!?【増殖するb】
プログラミング関連の絶版本・品切れ本をコチラから購入できます!
変数との入れ替えとエージェントスミスについて
変数とに異なる値が入っていて、それを入れ替えるアルゴリズムを書きましょう……というのは、プログラミングの入門書にありがちな問題で、ついさっきあるプログラミング言語の本を見ていたら、また書いてあった。
では、この問題の模範的な"間違え方"から紹介しよう。それが、
①とに値を入力
②
③
④とを出力
という解答*1。この間違え方をすると、本の著者や解答を知っている人にニヤニヤされるかもしれないので要注意だ!
落とし穴は②でにの値を代入しているところで、代入した瞬間にもも全部の値になってしまい、の値が跡形もなくなっている。いわば、このがマトリックスのエージェントスミスなのだ。
このようなスミスの無限増殖を防ぐ方法として、たぶん一番よく書いてある解法は、余分な変数を用意して、
①とに値を入力
②
③
④
⑤とを出力
として、の値が上書きされる前にに避けておけばいい。要は、がネオである。
さて、このないしネオは常に必要なのだろうか?そんなことを何となく考えていたら、を使わない第2の解答が存在することに気づいた。ただし、,が整数や実数等の数値である場合に限るけど。この解答は、厚めの本とか開けるとたぶん書いてありそうだけど……あえて紹介してみる!
を使わない解法とネオの休日
を使わないでとを入れ替えるには、どうしたらいいか?
それには、を完全にに置き換えるのではなく、との両方の情報を持つようにしておけばいい。つまり、に半分だけスミス分を入れる。
ここまで来ればもう簡単なので、解答を書いてみる。わかりやすくするため、とに最初に入っている値をとして、各ステップでに入っている値もカッコで囲って書いておく。
①,
②,
③,
④,
⑤とを出力
という風に、変数(ネオ)が休んでいても、との値は無事に入れ替えられた(Mission complete!)
*1:プログラミングでは左辺の変数に右辺の変数の値を代入するという意味。