• python经典百题之皮球掉落


    题目:

    一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
    
    • 1

    解法一:迭代法

    算法思路:

    1. 初始高度为100米,累计经过的距离初始化为0。
    2. 使用一个循环来模拟球的自由落地以及反弹的过程,重复10次。
    3. 在每一次循环中,球落地后高度减半,距离增加落地距离和反弹距离(即两倍的高度)。
    4. 最后统计得到第10次落地时的累计距离和反弹高度。

    优点:简单易懂,实现较为简单。
    缺点:需要进行10次循环计算,效率较低。

    Python代码实现:

    height = 100
    distance = 0
    
    for _ in range(10):
        # 落地距离
        distance += height
        # 反弹高度
        height /= 2
        # 反弹距离
        distance += height
    
    print("第10次落地时,共经过 %.2f 米" % distance)
    print("第10次反弹 %.2f 米" % height)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    解法二:数学公式

    算法思路:

    1. 第一次落地的距离为100米,第一次反弹的高度为50米。
    2. 之后的每一次落地,反弹的高度都是上一次的一半,落地的距离是前一次落地距离的两倍。
    3. 根据这个规律,可以推导出第n次落地时的总距离和反弹高度的数学公式,并直接计算得到结果。

    优点:不需要进行循环迭代,简化了计算过程,效率较高。
    缺点:需要理解并推导出数学公式。

    Python代码实现:

    # 第10次落地时的总距离
    distance = 100 * (1 - 2 ** 10) / (1 - 2)
    # 第10次反弹的高度
    height = 100 / (2 ** 10)
    
    print("第10次落地时,共经过 %.2f 米" % distance)
    print("第10次反弹 %.2f 米" % height)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    两种算法的输出结果相同:

    第10次落地时,共经过 299.61 米
    第10次反弹 0.10 米
    
    • 1
    • 2

    解法三:递归法

    算法思路:

    1. 定义一个递归函数,每次传入球的高度和落地次数。
    2. 递归的终止条件是落地次数达到10次,此时返回0。
    3. 在每次递归中,先计算当前落地的距离(传入的高度乘以2),然后递归调用函数计算下一次的落地距离,并加上当前落地的距离。
    4. 在递归调用的过程中,每次调用高度都减半,表示反弹的高度。

    优点:思路清晰,代码简洁。
    缺点:递归过程中会进行多次重复计算,效率较低。

    Python代码实现:

    def calculate_distance(height, count):
        if count == 0:
            return 0
        
        # 当前落地的距离
        distance = height * 2
        # 下一次落地的距离,并累加到当前落地的距离
        distance += calculate_distance(height / 2, count - 1)
        
        return distance
    
    distance = calculate_distance(100, 10)
    height = 100 / (2 ** 10)
    
    print("第10次落地时,共经过 %.2f 米" % distance)
    print("第10次反弹 %.2f 米" % height)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出结果与前两种方法相同:

    第10次落地时,共经过 299.61 米
    第10次反弹 0.10 米
    
    • 1
    • 2
  • 相关阅读:
    [Linux系统编程]_网络编程(五)
    毕业设计之基于知识图谱的电影推荐问答系统(python完整源码+说明文档+演示视频)
    【博士每天一篇文献-算法】Progressive Neural Networks
    Linux (一) 基础复习
    淘宝等电商平台API接口评论,item_review-获得商品评论
    isEmpty() 和 null的区别
    JavaScript操作BOM
    WPS通过“文档部件”的“域”设置图、表和公式的自动序列号
    基于桶的排序之基数排序以及排序方法总结
    vivado 高级编程功能1
  • 原文地址:https://blog.csdn.net/yechuanhui/article/details/132951596