继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

切棍子

holdtom
关注TA
已关注
手记 1885
粉丝 240
获赞 992


假设要把长度为 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.

©著作权归作者所有:来自51CTO博客作者stlf2004的原创作品,如需转载,请注明出处,否则将追究法律责任

go算法递归


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP