一、切木棒
题目:
假设要把长度为n 厘米的木棒切分为1 厘米长的小段,但是1 根木棒只能由1 人切分,当木棒被切分为3 段后,可以同时由3 个人分别切分木棒( 图2 )。
求最多有m 个人时,最少要切分几次。譬如n = 8,m = 3 时如下
图所示,切分4 次就可以了。
问题
- 求当n = 20,m = 3 时的最少切分次数。
- 求当n = 100,m = 5 时的最少切分次数。
思路
- 循环往复地工作一定要想到递归!
- 当木棒的个数小于人数时,那么切分一次,产生木棒个数个新木棒;
- 当木棒个数不小于人数时,那么切分一次,就产生人数个;
代码
//声明:代码来自于:https://blog.youkuaiyun.com/allen11112/article/details/106156053
public static int cutBar(int peoplenNum, int bars, int current){
int time = 0;
if( current >= bars ){
return 0;
} else if ( current < peoplenNum ){
time = 1 + cutBar(peoplenNum,bars, 2*current);
} else {
time = 1 + cutBar(peoplenNum, bars, current+peoplenNum);
}
return time;
}
思考
times 初始化在 方法中,并不会因为递归而导致 times 的值被重置。