考拉茲猜想的變體
阿新 • • 發佈:2018-07-07
var println pri strong 內容 如果 變體 一個 結果 “考拉茲猜想”是一個數學上的未解之謎。
同樣,如果初始值為4,則計算過程如下。
4?→?13?→?40?→?20?→?10?→?5?→?16?→8?→?4
但如果初始值為6,則計算過程如下,並不能回到初始值6。
6?→?19?→?58?→?29?→?88?→?44?→?22?→?11?→?34?→?17?→?52?→?26?→?13 →40?→?20?→?10?→?5?→?16?→?8?→?4?→?2?→?1?→?4?→?…
考拉茲猜想
對自然數 n 循環執行如下操作。
- n 是偶數時,用 n 除以 2
- n 是奇數時,用 n 乘以 3 後加 1
如此循環操作的話,無論初始值是什麽數字,最終都會得到 1(會進入1 → 4 → 2 → 1 這個循環)。
這裏我們稍微修改一下這個猜想的內容,即假設初始值為偶數時,也用 n 乘以 3 後加 1,但只是在第一次這樣操作,後面的循環操作不變。而我們要考慮的則是在這個條件下最終又能回到初始值的數。
譬如,以2為初始值,則計算過程如下。
2?→?7?→?22?→?11?→?34?→?17?→?52?→?26?→?13?→?40?→?20?→?10?→?5?→ 16?→?8?→?4?→?2
4?→?13?→?40?→?20?→?10?→?5?→?16?→8?→?4
但如果初始值為6,則計算過程如下,並不能回到初始值6。
6?→?19?→?58?→?29?→?88?→?44?→?22?→?11?→?34?→?17?→?52?→?26?→?13 →40?→?20?→?10?→?5?→?16?→?8?→?4?→?2?→?1?→?4?→?…
問題
求在小於 10000 的偶數中,像上述的 2 或者 4 這樣“能回到初始值的數”有多少個。
package main import "fmt" func collatz(n int)bool{ m := n * 3 + 1 for{ if m == 1{ return false }else if m == n{ return true } if m % 2 == 1{ m = m * 3 + 1 }else if m % 2 == 0{ m = m / 2 } } } func main(){ var s []int for i:=2;i<10001;i+=2{ if collatz(i){ s = append(s, i) } } fmt.Println(s) fmt.Printf("共 %d 個數\n", len(s)) }
結果:
[2 4 8 10 14 16 20 22 26 40 44 52 106 184 206 244 274 322 526 650 668 790 866 976 1154 1300 1438 1732 1780 1822 2308 2734 3238 7288]
共 34 個數
本來用遞歸函數,發現有些麻煩,就用了for循環,發現很容易就搞定了,只需註意跳出循環的條件設計就好。
考拉茲猜想的變體