python - 项目 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) 输出 550
解决方案
使用全局变量表明您没有递归地考虑这一点。
每个人肩上的重量是每个人肩上重量的一半。每个人的有效体重是他们的肩膀加上 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 +
。
那是你的大纲;你能从那里拿走吗?
推荐阅读
- javascript - Reanimated 在使用 useAnimatedStyle 时使应用程序崩溃
- javascript - SVG 作为 HighChart 堆叠柱形图中的标签
- java - Maven 错误:无法找到或加载主类并且无法编辑系统变量
- c# - Identity Server 4 客户端应用程序的单独登录屏幕
- kubernetes - 如何在 configmap 数据部分引用 pod 的 shell 环境变量
- javascript - 将数组中元素的值乘以 2
- c - ulong / unsinged long 不再工作了,C 改变了标准吗?
- google-chrome - Chrome >=93 未加载中指定的所有 JS 文件