python - 我在使百分比猜测器中的 y 循环工作时遇到问题
问题描述
几天前我在学习,但在过去的几天里,我的学习因一个问题而停止:无限的while循环。我在完成 MIT's Introduction to CS with python 的任务 1 的任务 3 时遇到了这个问题。此任务的说明如下。
C 部分:找到合适的储蓄金额 在 B 部分中,您有机会探索每月储蓄的工资百分比和每年的加薪如何影响您为首付而存钱的时间。这很好,但假设您想设定一个特定目标,例如能够在三年内支付首付。你每个月应该存多少钱来实现这个目标?在这个问题中,你将编写一个程序来回答这个问题。为了简化事情,假设:
你的半年加薪是 0.07 (7%)
您的投资的年回报率为 0.04 (4%)
- 首付为房屋成本的0.25(25%)
- 你节省的房子的成本是 100 万美元。
您现在将尝试找到最佳的储蓄率,以在 36 个月内支付 100 万美元的房子的首付。由于要做到这一点是一项挑战,我们只希望您的储蓄在所需首付的 100 美元以内。
在 ps1c.py 中,编写一个程序来计算最佳储蓄率,作为您起薪的函数。
您应该使用二分搜索来帮助您有效地执行此操作。您应该跟踪完成二等分搜索所需的步骤数。在这个问题中,您应该能够重用您为 B 部分编写的一些代码。
因为我们正在寻找一个原则上是浮点数的值,所以我们将把自己限制在小数点后两位的精度(即,我们可能希望保存为 7.04% 或十进制的 0.0704 - 但我们不会担心7.041% 和 7.039% 之间的差异)。这意味着我们可以搜索 0 到 10000 之间的整数(使用整数除法),然后将其转换为小数百分比(使用浮点除法),以便我们在 36 个月后计算 current_savings 时使用。通过使用这个范围,我们只搜索有限数量的数字,而不是 0 和 1 之间的无限小数。这个范围将有助于防止无限循环。我们使用 0 到 10000 的原因是为了在 0% 到 100% 的范围内增加两个小数位。您的代码应该打印出一个小数(例如 0.0704 表示 7.04%)。
为您的起薪尝试不同的输入,并查看您需要保存更改的百分比以达到所需的首付。另请记住,可能无法在一年半内为某些薪水节省首付。在这种情况下,您的函数应通知用户无法通过打印声明在 36 个月内保存首付。请让您的程序以下面测试用例中显示的格式打印结果。
注意:有多种正确的方法可以实现二分搜索/步数,因此您的结果可能与测试用例的结果不完全匹配。
提示
● 可能有多种储蓄率,产生的储蓄金额在 100 万美元房屋所需首付的 100 美元以内。在这种情况下,您可以只返回任何可能的值。
● 根据您的停止条件和计算二分搜索试验值的方式,您的步数可能与示例测试用例略有不同。
● 在计算节省的百分比是否合适以及计算最终的小数百分比节省率时,请注意整数除法。
● 记住在每次二等分搜索迭代时将适当的变量重置为其初始值。
测试用例 1
In[1]: Enter the starting salary: 150000
Out[1]: Best savings rate: 0.4411
Steps in bisection search: 12
测试用例 2
In[2]: Enter the starting salary: 300000
Out[2]: Best savings rate: 0.2206
Steps in bisection search: 9
测试用例 3
In[3]: Enter the starting salary: 10000
Out[3]: It is not possible to pay the down payment in three years.
我为此任务创建的代码是休闲的。
annual_income = float(input("put your income here:"))
down_payment = float(250000)
high = float(1)
low = float(0)
rate = float((high + low)/2)
steps = 0
m = 0
interest = 0.04
savings = 0
while m <= 36:
if m % 6 == 0:
annual_income = annual_income * float(1.07)
savings = savings + (annual_income * rate)/12 + (annual_income * interest)/12
m += 1
x = float(savings - down_payment)
while x != 0.01:
if rate > 1:
break
elif x < 0.01:
low = rate
elif x > 0.01:
high = rate
steps += 1
if x == 0.01:
print(str(rate))
print(str(steps))
else:
print("cant be done")
通过在这段代码中插入打印语句,我发现它运行平稳,直到它到达 while 循环。当我将打印语句放入 while 循环时,我的浏览器崩溃了,这意味着 while 循环正在工作,但它永远不会停止工作。我花了大约 3 天的时间试图破译为什么会发生这种情况,但不幸的是,我的努力没有取得任何进展。所以我转过来看看是否有人能告诉我为什么我的while循环继续无限运行。我试图在这篇文章中尽可能清楚,但如果由于某种原因我未能实现这个目标,请随时提出问题。感谢您花时间帮助我。
解决方案
所以我检查了一下,它似乎卡在了第二个 while 循环中。
所以让我们一步一步来。您设置m=0
,只要m <= 36
它成立,当且仅当m % 6 == 0
这是真的时才介入,如果是这样的话,一些代码,然后将 m 增加 1。
现在我们在x = (savings - down_payment)
,x 将输出一些高的正数或负数,比如说 20,000 美元。
只要x != 0.01
哪一个总是正确的,因为 x 永远不会是 0.01。所以你的while循环将无限卡在这里
推荐阅读
- c - WSAConnect - 远程服务器响应端口 80 和 443
- java - 为 FeignClient RetryableException 设置 HTTP 状态
- c# - datagridview 单元格相乘并求和文本框中的列
- service-reference - 服务引用上的 C# 中的 FakeItEasy
- linux - VS Code 无法正确响应 Linux Mint 中的键盘切换?
- java - 是否可以在没有嵌套循环的情况下读取整个 XML 文件
- css - 如何覆盖从 ui-include 生成的 div 类
- snowflake-cloud-data-platform - 通过 snlowsql 复制到命令时加载 csv 文件时出错
- php - 当 URl 存在时,Strrpos 无法正常工作
- java - spring boot - undertow https 会话不会过期或停止 ssl 握手