1. 178inaba

    Posted

    178inaba
Changes in title
+hello worldより「コラッツの問題」書くほうがいろいろ学べそう
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,86 @@
+wikipediaサーフィンしてたら[コラッツの問題](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C)ってのを見つけました。
+
+擬似コード
+
+```
+def collatz(n)
+ show n
+ if n.odd? and n > 1
+ collatz(3n + 1)
+ else if n.even?
+ collatz(n / 2)
+```
+
+実際に動かしてみたくなって最近はgoにハマっているのでgoで書いてみた。
+工夫した所は
+・引数で最初の値を取れるようにした。
+・大きい値が処理できるようにuint64で処理するようにした。
+・一個一個の答えが見られるようにsleepを入れた。
+
+```go:collatz.go
+package main
+
+import (
+ "flag"
+ "fmt"
+ "time"
+)
+
+func main() {
+ n := flag.Uint64("n", 1, "collatz start num")
+ flag.Parse()
+
+ num := *n
+
+ if num < 1 {
+ fmt.Println("Invalid value:", num)
+ return
+ }
+
+ collatz(num)
+}
+
+func collatz(num uint64) {
+ fmt.Println(num)
+ time.Sleep(time.Second / 2)
+
+ if num%2 == 1 && num > 1 {
+ collatz(3*num + 1)
+ } else if num%2 == 0 {
+ collatz(num / 2)
+ }
+}
+```
+
+書いてみて思ったんですが、hello world書くよりいろいろ学べそうじゃないですか?
+標準出力はもちろん、関数の作り方呼び方、比較演算子、算術演算子、if
+
+なので今後新しい言語でhello worldしたら次はコラッツの問題を書いていこうかな〜って思った次第です。
+
+さっそくシェルスクリプトで書いてみました。
+計算にはbcコマンドだと大きい値が使えるらしいのでbcコマンド使いました。
+
+```bash:collatz.sh
+#!/bin/sh
+collatz() {
+ n=$1
+ echo $n
+ sleep 0.5s
+ if [ `echo "$n % 2" | bc` -eq 1 ] && [ $n != "1" ]; then
+ collatz `echo "3 * $n + 1" | bc`
+ elif [ `echo $n % 2 | bc` -eq 0 ]; then
+ collatz `echo $n / 2 | bc`
+ fi
+}
+
+collatz $1
+```
+
+ifの書き方とか引数の指定とかでけっこう引っかかりました。
+でもこれで99999999999999999999999999999999999999999999999999999999999999995まで計算出来ました。
+wikipediaには
+
+>この予想は、初期値が 5 × 260 = 5,764,607,523,034,234,880までは成り立つことがコンピュータでチェックされている。
+
+と書いてありましたがまさか新記録!?
+・・・なわけないとは思いますがw