まず、単純に コラッツ計算をして、計算の長さをもとめてみます。
ccc.rb
ruby
1# https://qiita.com/keigo1450/items/d9605c94770e928409c0
2# コラッツ問題でRubyの練習
3def collatz(n)
4 if n.even?
5 n / 2
6 else
7 (n * 3) + 1
8 end
9end
10
11try = 0
12n = ARGV[0].to_i
13
14puts "Start: #{n}"
15loop do
16 break if n == 1
17 try += 1
18 n = collatz(n)
19 puts format("%10d", n)
20end
21puts "Steps: #{try}"
22
コラッツ計算を再帰をつかって書き直してみます。
ccc1.rb
ruby
1def collatz_x(n)
2 puts format('%8d', n)
3 return if n == 1
4
5 if n.even?
6 collatz_x(n / 2)
7 else
8 collatz_x(n * 3 + 1)
9 end
10end
11
12n = ARGV[0].to_i
13collatz_x(n)
collatz_x は、計算経過を puts で表示してますが、メソッドからの返り値はありません。
返り値を +1 したものを返すようにすると、この関数がよばれた回数を得ることができます。
ccc2.rb
ruby
1def collatz_x(n)
2 puts format('%8d', n)
3 return 0 if n == 1
4
5 if n.even?
6 collatz_x(n / 2) + 1
7 else
8 collatz_x(n * 3 + 1) + 1
9 end
10end
11
12n = ARGV[0].to_i
13puts collatz_x(n)
それぞれを実行した結果を示します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。