切棍子

假設要把長度爲 n 釐米的木棒切分爲 1 釐米長的小段,可是 1 根木棒只能由 1 人切分,當木棒被切分爲 3 段後,能夠同時由 3 我的分別切分木棒( 圖2 )。
求最多有 m 我的時,最少要切分幾回。譬如 n = 8,m = 3 時以下圖所示,切分 4 次就能夠了。
切棍子ide

問題1
求當 n = 20,m = 3 時的最少切分次數。
問題2
求當 n = 100,m = 5 時的最少切分次數。函數


package main

import "fmt"

func cutbar(n,m,current int)int{
    if current >= n{
        return 0
    }else if current <= m{
        return 1 + cutbar(n,m,current*2)
    }else {
        return 1 + cutbar(n,m,current+m)
    }
}

func main(){
    times := cutbar(20,3,1)
    fmt.Println(times)
    times2 := cutbar(100,5,1)
    fmt.Println(times2)

}

這裏使用遞歸函數較爲方便,n是棍子釐米數,m是人數,current是當前棍子的段數。code

  1. 每次運算查看當前棍子段數量少於等於人數,則棍子數量翻倍,返回切分棍子的次數加1;
  2. 棍子段數且少於釐米數,則棍子不能全被切翻倍,只能增長m個,返回切分棍子的次數加1;
  3. 當棍子段數大於等於釐米數時,表示已切完,不用再切了,返回次數爲0。結果是8和22.
相關文章
相關標籤/搜索