MIT OCW Python PS 1 1c - 不确定如何合并二分搜索

问题描述

这是我的第一个问题,所以如果问题的格式或我的提问方式不当,我深表歉意。我正在尝试解决本课程的 1c:https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/assignments/ 完整的原始 PS 问题粘贴在底部

我一直在使用这些来尝试排除故障。 MIT programming in python Problem Set 1 Part C https://www.rookieslab.com/posts/linear-search-vs-bisection-search-in-python https://www.rookieslab.com/posts/finding-square-root-using-guess-and-check-algorithm-in-python

我认为我如何结合 for 循环来显示加薪和二分搜索存在问题。当我自己测试它时,它计算正确,但它导致代码在 36 轮后停止,这没关系,但它也没有给我适当的储蓄率。不正确的储蓄率可能源于我如何在 for 循环中加入二分搜索,但我不确定如何打破它以获得正确的答案。

测试:输入起薪:150000 最佳储蓄率:0.4411

annual_salary = float(input("Congratulations on your new job,I hear you want to purchase your dreamhome. "
                        "Let me do a little math to help you determine the savings rate needed to make "
                        "a 25% downpayment. To kick things off,what's your annual Salary? "))
total_cost = float(1000000)
semi_annual_raise = float(.07)
r = float(0.04)  #
portion_downpayment_amount = (total_cost * float(.25))
current_savings = 0
months_saved = 0
monthly_salary = annual_salary / 12
low = 0
high = 10000
savings_rate = (low + high)/2
deposit_amount  = current_savings * savings_rate

while current_savings < portion_downpayment_amount:
    current_savings += deposit_amount
    savings_rate = (low + high) / 2
    for months_saved in range(0,36):
        months_saved += 1
        if months_saved % 6 == 0:
            monthly_salary = ((monthly_salary * semi_annual_raise) + monthly_salary)
            savings_rate = (low + high)/2
            deposit_amount = savings_rate * monthly_salary
    if current_savings < portion_downpayment_amount:
        low = savings_rate
    elif current_savings > portion_downpayment_amount:
        high = savings_rate
        print('Best savings rate:',savings_rate)
        print('Current Savings',current_savings)
        print('Steps in bisection search:',months_saved)
        break
    else:
        print('It is not possible to pay the down payment in three years.')
        break

C 部分:找到合适的储蓄金额 在 B 部分,您有机会探索您储蓄的工资百分比 每个月和你每年的加薪会影响你储蓄的时间 为首付。这很好,但假设你想设置一个 特定目标,例如能够负担得起三年的首付 年。为了实现这一目标,您每个月应该存多少钱?在这 问题,你将编写一个程序来回答这个问题。 为了简化事情,假设:

  1. 您每半年加薪 0.07 (7%)
  2. 您的投资年回报率为 0.04 (4%)
  3. 首付是房屋成本的 0.25 (25%)
  4. 您存钱买的房子的成本是 100 万美元。

您现在将尝试找到最佳储蓄率以实现 在 36 个月内支付 100 万美元房屋的首付。既然准确地击中了这个 是一个挑战,我们只是希望您的储蓄在 100 美元以内 需要的首付。在 ps1c.py 中,编写一个程序来计算 最佳储蓄率,作为您的起薪的函数。你应该 使用二分搜索来帮助您有效地执行此操作。你应该保持 跟踪二分搜索所需的步骤数 结束。您应该能够重用您为之编写的一些代码 这个问题的 B 部分。

因为我们正在寻找一个原则上是一个浮点数的值,我们 将把自己限制在两位小数的准确度(即,我们可能 想要节省 7.04% 或 0.0704(十进制)——但我们不会 担心 7.041% 和 7.039% 之间的差异)。这意味着 我们可以搜索 0 到 10000 之间的整数(使用 integer 除法),然后将其转换为十进制百分比(使用浮点数 除法)在我们计算 36 之后的 current_savings 时使用 个月。通过使用这个范围,只有有限数量的数字 我们正在寻找的,而不是无限数量的 0 到 1 之间的小数。这个范围将有助于防止无限循环。 我们使用 0 到 10000 的原因是为了说明两个额外的小数 位于 0% 到 100% 的范围内。你的代码应该打印出一个小数 (例如 0.0704 代表 7.04%)。

为您的起薪尝试不同的输入,看看效果如何 您需要保存更改以达到所需的百分比 支付。另请记住,可能无法保存下来 一年半后支付部分工资。在这种情况下你的 函数通知用户无法保存 36 个月内的首付与打印报表。请让你的 程序以下面测试用例中显示的格式打印结果。

注意:实现二分有多种正确方法 搜索/步骤数,因此您的结果可能与那些不完全匹配 测试用例。

提示

● 可能有多个储蓄率产生的储蓄金额 位于 100 万美元房屋所需首付的 100 美元以内。在这 情况下,您可以只返回任何可能的值。

● 取决于您的停止条件以及您如何计算试验 二分搜索的值,您的步数可能略有不同 来自示例测试用例。

● 计算百分比时注意整数除法 保存是合适的,在计算最终小数百分比时 储蓄率。

● 记住将适当的变量重置为其初始值 对分搜索的每次迭代的值。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)