切棍子

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

問題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是當前棍子的段數。

  1. 每次運算查看當前棍子段數量少於等於人數,則棍子數量翻倍,返回切分棍子的次數加1;
  2. 棍子段數且少於釐米數,則棍子不能全被切翻倍,只能增加m個,返回切分棍子的次數加1;
  3. 當棍子段數大於等於釐米數時,表示已切完,不用再切了,返回次數爲0。
    結果是8和22.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章