首页 > 解决方案 > 项目 2 人类金字塔计算

问题描述

为简单起见,我们假设金字塔中的每个人的体重正好是 200 磅。金字塔顶端的人 A 的背上没有重量。B 人和 C 人各负有 A 人一半的重量。这意味着他们每个人都肩负着 100 磅。现在,让我们看看第三排的人。让我们从关注人 E 开始。她支持多少体重?嗯,她直接支撑 B 人一半的重量(100 磅)和 E 人一半的重量(100 磅),所以她至少支撑 200 磅。最重要的是,她感受到了 B 和 C 人所承受的一些重量。B 人肩负的一半重量(50 磅)传给 E 人,C 人肩负的一半重量(50 磅)同样传给 E 人,因此,E 人最终感觉体重增加了 100 磅。这意味着她总共支持了 300 磅的净重。

编写一个递归函数(不使用循环),weightOn(r,c),它返回 r 行和 c 列中人背部的重量。行和列是从 0 开始的,因此顶部位置是 (0,0),例如,人 H 的位置是 (3,1)。以下也成立: weightOn(0,0) == 0.00 weightOn(3,1) == 425.00 权重应该是浮点数。

我已经尝试了很多。我将在下面包含我最近的代码。

t = 0.0
x = 0.0

def weightOn(r, c):

    global t
    if r < 0:
        print('Not valid')
    elif r == 0 and c == 0:
        return t
    elif r > 0 and c == 0:
        t += 200 / (2 ** r)
        return weightOn(r - 1, 0)
    elif r > 0 and c == r:
        t += 200 / (2 ** r)
        return weightOn(r - 1, 0)
    elif r > c > 0:
        mid(r, c)
        return t

def mid(r, c):

    global x
    x = weightOn(r - 1, c - 1) + weightOn(r - 1, c)
'''I have also tried: x = (((weightOn(r - 1, c - 1) + 200) / 2) + ((weightOn(r - 1, c) + 200) / 2))'''
    return x

r = int(input('r: '))
c = int(input('c: '))
weightOn(r, c)
if r > c > 0:
    print(x)
else:
    print(t)

它总是带来错误的输出。我可以正确地拉起所有边缘(当 c == 0 或 c == r 时)。但除此之外它不会工作。

前任。输入 (3, 1) 输出 500 (3, 2) 输出 55​​0

标签: pythonrecursion

解决方案


使用全局变量表明您没有递归地考虑这一点。

每个人肩上的重量是每个人肩上重量的一半。每个人的有效体重是他们的肩膀加上 200 磅。如果一个人在边缘,那么另一个肩膀上的“人”的重量为 0。

所以 ...

def weight(r, c):
# Code base cases
if r < 0:            # Past the pyramid top; no such person
    return 0
if c < 0 or c > r:   # Off the edge; no such person
    return 0
return 200 + (weight(r - 1, c - 1) + weight(r - 1, c)) / 2

然后weightOn就是上面没有的例程200 +

那是你的大纲;你能从那里拿走吗?


推荐阅读