RosettaCodeData/Task/Hailstone-sequence/Go/hailstone-sequence-1.go

36 lines
837 B
Go
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
package main
import "fmt"
2014-01-17 05:32:22 +00:00
// 1st arg is the number to generate the sequence for.
// 2nd arg is a slice to recycle, to reduce garbage.
func hs(n int, recycle []int) []int {
s := append(recycle[:0], n)
2013-04-10 21:29:02 -07:00
for n > 1 {
if n&1 == 0 {
n = n / 2
} else {
n = 3*n + 1
}
s = append(s, n)
}
2014-01-17 05:32:22 +00:00
return s
2013-04-10 21:29:02 -07:00
}
func main() {
2014-01-17 05:32:22 +00:00
seq := hs(27, nil)
2013-04-10 21:29:02 -07:00
fmt.Printf("hs(27): %d elements: [%d %d %d %d ... %d %d %d %d]\n",
len(seq), seq[0], seq[1], seq[2], seq[3],
seq[len(seq)-4], seq[len(seq)-3], seq[len(seq)-2], seq[len(seq)-1])
var maxN, maxLen int
for n := 1; n < 100000; n++ {
2014-01-17 05:32:22 +00:00
seq = hs(n, seq)
2013-04-10 21:29:02 -07:00
if len(seq) > maxLen {
maxN = n
maxLen = len(seq)
}
}
fmt.Printf("hs(%d): %d elements\n", maxN, maxLen)
}