0
点赞
收藏
分享

微信扫一扫

【verilog教程】verilog函数

西风白羽 2024-12-02 阅读 8

1. 题目

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

2. 分析

  • 经过路程分析
    • 第一次下落,球经过的路程就是初始高度100米。
    • 第一次反弹后再次落下,经过的路程是第一次反弹高度的两倍(上去再下来),第一次反弹高度为 100 ÷ 2 = 50 100 \div 2 = 50 100÷2=50米,所以这一段经过的路程是 50 × 2 = 100 50×2 = 100 50×2=100米。
    • 第二次反弹后再次落下,经过的路程是第二次反弹高度的两倍,第二次反弹高度为 50 ÷ 2 = 25 50 \div 2 = 25 50÷2=25米,这一段经过的路程是 25 × 2 = 50 25×2 = 50 25×2=50米。
    • 以此类推,每次反弹后再次落下经过的路程都是该次反弹高度的两倍。
    • 要求第10次落地时共经过的路程,需要累加每次下落和反弹落下经过的路程。
  • 第n次反弹高度分析
    • 每次反弹高度都是上一次落地高度的一半,所以第n次反弹高度可以通过初始高度依次除以2的n次方得到。

3. 实例代码

#include <stdio.h>

int main() {
    double height = 100; // 初始高度
    double totalDistance = 100; // 初始总路程为第一次下落的100米
    int n = 10; // 落地次数

    // 计算每次反弹后再次落下经过的路程并累加
    for (int i = 1; i <= n; i++) {
        height /= 2;
	printf("第%d次落地时,反弹高%f米\n", i, height);
        totalDistance += 2 * height;
    }

    printf("第10次落地时,共经过%f米。\n", totalDistance);
    printf("第10次反弹高度为%f米。\n", height);

    return 0;
}
  • 变量height表示球的当前高度(初始为100米),totalDistance表示球总共经过的路程(初始为第一次下落的100米),以及n表示落地次数(设置为10)。
  • 通过for循环,模拟球每次反弹后再次落下的过程,在循环中更新height为上一次高度的一半,并将本次反弹后再次落下经过的路程(即2 * height)累加到totalDistance中。
  • 循环结束后,输出第10次落地时经过的总路程和第10次反弹高度。

4. 输出结果

image.png

5. 递归求解

#include <stdio.h>

// 递归函数计算每次落地后经过的路程
double calculateDistance(int n) {
    if (n == 1) {
        return 50;
    } else {
        return calculateDistance(n - 1) / 2;
    }
}

int main() {
    int n = 10; // 落地次数

    // 计算第10次落地时经过的总路程,每次有往返,所以乘以2
    double totalDistance = 100;
    for (int i = 1; i < n; i++) {
        totalDistance += 2 * calculateDistance(i);
    }

    // 计算第10次反弹高度
    double tenthReboundHeight = calculateDistance(n);

    printf("第10次落地时,共经过%f米。\n", totalDistance);
    printf("第10次反弹高度为%f米。\n", tenthReboundHeight);

    return 0;
}

6. 等比数列求解

#include <stdio.h>
#include <math.h>

int main(void) {
    float initialHeight = 100; // 初始高度,即球第一次下落的高度
    float commonRatio = 0.5; // 公比,表示每次弹起高度是上次落地高度的一半

    // 计算第10次反弹高度
    float tenthReboundHeight = initialHeight * pow(commonRatio, 10);

    // 计算从第一次弹起再落下到第9次弹起再落下的路程和(不包括第一次下落的100米)
    float sumWithoutFirstDrop = 2 * (initialHeight * commonRatio - tenthReboundHeight * commonRatio) / (1 - commonRatio);

    // 计算第10次落地时经过的总路程(包括第一次下落的100米)
    float totalDistance = sumWithoutFirstDrop + initialHeight;

    printf("第10次落地时,共经过%.2f米。\n", totalDistance);
    printf("第10次反弹高度为%.2f米。\n", tenthReboundHeight);

    return 0;
}
举报

相关推荐

0 条评论