几天前我在学习,但是在过去的几天里,我的学习因一个问题而停顿了:无限的while循环。我在使用python完成MIT CS入门入门的作业1时遇到此问题。此任务的说明如下。
C部分:寻找合适的金额进行储蓄 在B部分中,您有机会探索每月节省的工资百分比 而您的年度加薪会影响您节省首付款的时间。很好,但是 假设您要设定一个特定的目标,例如能够在三年内支付首付。 您每个月应节省多少费用以实现此目标?在这个问题中,您将要编写一个 程序来回答这个问题。为简化起见,假设:
您的半年度加薪为.07(7%)
您的投资的年收益率为0.04(4%)
您现在将尝试找到最佳的储蓄率,以在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循环正在工作,但永远不会停止工作。我花了大约三天的时间来解释为什么会发生这种情况,但是不幸的是,我的努力没有取得任何进展。因此,我转过这里来看看是否有人可以告诉我为什么我的while循环继续无限运行。在本文中,我尽力做到清晰,但是如果由于某些原因我未能达到目标,请随时提出问题。谢谢您抽出宝贵的时间来帮助我。
答案 0 :(得分:0)
所以我检查了一下,它似乎卡在了第二个while循环中。
所以让我们一步一步走。您只要设置m=0
为真,就设置m <= 36
当且仅当m % 6 == 0
为真,如果是,则执行一些代码,然后将m加1。
现在我们在x = (savings - down_payment)
,x将输出一些高正数或负数,例如$ 20,000。
只要x != 0.01
始终为真,因为x永远不会为0.01。所以您的while循环将无限地停留在这里