忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

whileループの復習

whileループはプログラミングの基本の1つで、あるコードを何度も実行させることができる機能です。私はこれを再解釈してみます。タイムマシンコンピュータを普通のコンピュータでシミュレートする時ループが必要なのですが、なら逆に、whileループをタイムトラベルのシミュレーションのようなものだと考えることも出来るかもしれません。なにしろループを繰り返す物語は多いですからね。


whileループの例

whileループで、6を割り切れる最初の自然数を計算するプログラムは、次のようになります。

function factorSemiprime(semiprime){
	const offset = 2;
	var data = 0;

	while(semiprime % (data + offset) != 0){
		data++;
	}

	return data + offset;
}

var semiprime = 6;
var prime = factorSemiprime(semiprime);
console.log(semiprime + " = " + prime + " * " + (semiprime / prime));

実行結果

6 = 2 * 3

このプログラムは、2から数字を1つずつ上げていってそれで6を割り切れるかチェックし、割り切れたらその時の数字を返します(このケースでは幸運なことに最初の2で6を割り切れるので、すぐにループは終わります)。このように、whileループはいつ正答が手に入るかわからない計算を繰り返し行うのに使うことが出来ます。6を割り切れる数字が手に入っていない限り、ループを繰り返すのです。

タイムマシンコンピュータを利用した例

次の例は、同じ計算をタイムマシンコンピュータを使ってするよう書き換えたものです:

function factorSemiprime(semiprime){
	const offset = 2;
	var results = TimeMachine.run(2, (timeMachine) => {
		var data = timeMachine.fromFuture();

		if(semiprime % (data + offset) != 0){
			data++;
		}

		timeMachine.toPast(data);
	});

	return results.map(n => n + offset)[0];
}

var semiprime = 6;
var prime = factorSemiprime(semiprime);
console.log(semiprime + " = " + prime + " * " + (semiprime / prime));

実行結果

6 = 2 * 3

このとおり、実行結果は全く同じです。それだけでなく、コードもすこし似ています。コード中の太字の行に注目して下さい。whileループにもほとんど同じ箇所が見つかります。whileループは6を今の数字で割り切れなかったら、数字を変えて再検証します。タイムマシンコンピュータのシミュレーションでは、6を今の数字で割り切れなかったら、その歴史を消滅させてしまうのです。両者とも、いろんな候補を検証して、正解にたどり着くまで止まらないという点では同じです。

ということは、whileループはある意味、普通のコンピュータでタイムマシンコンピュータのようなことをしているとも解釈できます。じっさい、whileループの構文をそのように見ることもできます:

while(今の歴史は気に食わない){
    別の歴史に移る
}

これはまさに、主人公が何度も同じ日をループするSF的物語です。主人公は何かを達成するまで、次の時間に進むことができません(多分知り合いを死から救いたいのでしょう)。whileループもタイムマシンコンピュータのシミュレーションも、これをやっているのです。実に感動的です。

アクティビティ図

アクティビティ図(プログラマ達がプログラムの流れを目で確認するのに使う)で上記の話を再確認します。この確認は必須ではありませんが、物事をいろんな角度から見ておくのは理解を深めるのに良いことです。

whileループの流れは、次のような図で表されます:

これはアクティビティ図という図で、プログラムの流れを絵として確認できます。プログラムは●からスタートして、◎がゴールです。最初に●からひし形に移動します。ひし形では今の状態をチェックします。6をいま用意してある数字で割ったあまりが0なら、つまり割り切れるなら、◎に行ってプログラムは終了します。もし割り切れなかったら、今の数字を別の数字に変更して、それで6を割り切れるかチェックするのです。これはループです。6を割り切れる数字が手に入るまで、いつまでたっても解脱(!)できません。

この図は、タイムトラベルの無矛盾な歴史の計算として解釈することもできます。

この図はさっきの図とほぼ同じです。違うのは、文章による解説だけです。タイムパラドックスのない無矛盾な歴史の計算は、●から◎に行く過程で行われます。最初に未来から送られてくる情報を適当に決めて、その情報で無矛盾な歴史が生まれるかを◇でチェックします。無矛盾な歴史だったら◎に行って終わりです。しかしもしその歴史がタイムパラドックスを生み出すなら、□に移動して別の歴史の計算をやり直し、また◇でチェックします。

これは思い通りにいかなかったら何度でも繰り返す努力家――あるいはストーカー――のような計算です。これなら時間はかかりますが、確実に矛盾のない歴史が手に入るでしょう。

タイムマシンコンピュータのシミュレーションに時間がかかる理由はこれです。本物のタイムマシンコンピュータなら、ループなど行わずに、◇からいきなり◎に行きます。しかし私達が持っているのは古典的コンピュータだけなので、わざわざループするしかないのです。本物のタイムマシンコンピュータは、普通のコンピュータなら何度もループするところを、全く迷わず――まるで未来が見えているかのように――答えにたどり着けるのです。まさに天才です。

拍手[0回]

PR