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