考拉茲猜測的變體

「考拉茲猜測」是一個數學上的未解之謎。app

考拉茲猜測
對天然數 n 循環執行以下操做。ide

  • 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,則計算過程以下。
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))
}

結果:code

[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循環,發現很容易就搞定了,只需注意跳出循環的條件設計就好。遞歸

相關文章
相關標籤/搜索