(改造版)コラッツの予想
さて、今回もawkでパズルを解いてみます。
コラッツの予想 自然数nについて、 ・nが偶数の場合、nを2で割る ・nが奇数の場合、nに3をかけて1を足す という操作を繰り返すとき、初期値がどんな数であっても必ず1に到達する (1→4→2→1のように繰り返す) この予想の内容を少し変えて、初期値が偶数の場合、初回のみnに3をかけて1を 足すことから始めることとし、「最初の数」に戻るものを考えます。 2→7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2 4→13→40→20→10→5→16→8→4 10000以下の偶数のうち、「最初の数にもどる数」がいくつあるでしょうか?
awkも他の言語と同様、再帰呼出しが使えます。
今回は再帰で解きました。
#!/usr/bin/awk -f BEGIN{ n = 2; cnt = 0; while(n <= 10000){ f = 1; num = n; collatz(n,num,f); n += 2; } print cnt; } function collatz(n,num,first){ if(first != 1 && n == num){ cnt++; return; } if(n == 1){ return; } if(n % 2 == 0){ # 偶数なら if(first == 1){ # 初回のみ first++; return collatz(n * 3 + 1,num,first); }else{ return collatz(n / 2,num,first); } }else{ # 奇数なら return collatz(n * 3 + 1,num,first); } }
実行してみます。
awk -f q06.awk 34