假設要把長度爲 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;
- 棍子段數且少於釐米數,則棍子不能全被切翻倍,只能增加m個,返回切分棍子的次數加1;
- 當棍子段數大於等於釐米數時,表示已切完,不用再切了,返回次數爲0。
結果是8和22.