1. 178inaba

    No comment

    178inaba
Changes in body
Source | HTML | Preview
@@ -1,86 +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を入れた。
+・一個一個の答えが見られるように0.5秒の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