Lab Exercise
息抜きにプログラミングの問題
研究室では、B4向けの勉強会が開かれるのだが(各M1が主催となる)研究のコードだけではつまらないよねってことで、たまに何問か頭の体操チックなプログラミング問題を一緒に考えたりすることで、コーディング初心者のB4も一緒に楽しみながら勉強会ができればいいなと、ふわっとした感じで始めた。(問題は適当にネットから漁ってくる)この前行った2問を紹介
コラッツの問題
すべての数字は- その数が偶数だったら2で割る
- その数が奇数だったら3倍して1を足す
上記の処理を繰り返すことで1に収束するらしい。
収束過程までの履歴を表示する関数を作れ。
ハッカーの遺言状
4, 9, 16, 25といった平方数を抜いた2以上の数の列
(2,3,5,6,7,8,10,11,12,13,14,15,17,18,19,20,21,22,23,24,26,……)
のn番目の数を求める関数を作れ。
例えば、n=3なら5を返す。
1問目は難なくB4もできて、みんな同じようなコードになっていた(whileで回す人と再帰で求める人がいた) 2問目は結構求め方が様々で、そんな発想もあるんだなといろいろと勉強になった。
自分が書いたコードを一部紹介(言語はC#)
1問目
public static void show_collatz(int n) { if (n == 1) { Console.WriteLine("end"); } else { if (n % 2 == 0) { int new_n = n / 2; Console.WriteLine(new_n); show_collatz(new_n); } else { int new_n = n * 3 + 1; Console.WriteLine(new_n); show_collatz(new_n); } } }
2問目
public static void not_square(int n) { int sq = (int)Math.Sqrt(n) - 1; // Console.WriteLine(sq); int sub = (int)Math.Sqrt(n + 1 + sq) - 1 - sq; // Console.WriteLine(sub); Console.WriteLine(n + 1 + sq + sub); }