为什么';我的二分法行不通吗?python

为什么';我的二分法行不通吗?python,python,bisection,Python,Bisection,我正在为Python类编写一个信用卡支付计算器。作业是写一个计算器的定义,计算出在x个月内使你的余额为零所需的每月付款 该定义包含3个参数:初始余额、apr、月份 据我所知,作业的重点是让我们使用二分法来找到答案,我还写了另外两个定义来帮助作业: 1) newBalance()-确定付款后的新余额; 2) 余额()-在付款后返回余额列表 有鉴于此,balances()[-1]返回最终余额,因此我的行动计划是将列表中的最后一项评估为等于0(或至少在0.005范围内!),如果是,则返回使我达到该值的

我正在为Python类编写一个信用卡支付计算器。作业是写一个计算器的定义,计算出在x个月内使你的余额为零所需的每月付款

该定义包含3个参数:初始余额、apr、月份

据我所知,作业的重点是让我们使用二分法来找到答案,我还写了另外两个定义来帮助作业:

1) newBalance()-确定付款后的新余额; 2) 余额()-在付款后返回余额列表

有鉴于此,balances()[-1]返回最终余额,因此我的行动计划是将列表中的最后一项评估为等于0(或至少在0.005范围内!),如果是,则返回使我达到该值的付款

如果最终余额为负数(我付了太多!):payment=payment-(payment/2); 如果余额为正(我还没有付足够的钱!):payment=payment+(payment/2)

尽我所能,我的算法最终应该会得出结论,但它从未找到足够接近的答案

这是我的代码(最后是教授的测试def):

def newBalance(预付款余额、四月、付款):
"""
-prevBalance:信用卡对账单上的余额。
-apr:年百分比(这里15.9表示15.9%)。
-付款:本月支付给信用卡公司的金额。
-返回:信用卡上的新余额
(假设未进行购买)。
"""
利息费用=浮动((4月/12.0)/100)*余额
返回浮动((利息费用+余额)-支付)
def余额(初始余额、apr、付款):
"""
-初始余额:信用卡上的初始余额。
-apr:年百分比(这里15.9表示15.9%)。
-付款:信用卡上每月付款的列表。
-返回:列出信用卡上的余额的列表
月份。列表中的第一个数字是首字母
余额,下一个数字是第一个数字之后的余额
付款已完成,依此类推。请注意,返回的
清单为len(付款)+1。
"""
余额表=[]
balancelist.append(初始余额)
对于范围(0,len(付款))内的x:
余额列表。追加(新余额(余额列表[x],4月,付款[x]))
返回余额表
def Find每月付款(初始余额,4月,个月):
"""
-初始余额:卡上的起始余额。
-四月:四月。
-月数:您希望每月支付的相等金额
使平衡降到零。
-退货:减少费用所需的每月付款金额
余额为零(无论如何,“零”在0.005美元以内)
在给定的月数内。
"""
猜测=浮动(初始余额/月)
listo=月份*[猜测]
尽管如此:
如果abs(浮动(余额(初始余额,apr,listo)[-1])-初始余额)<0.006:
打印“宾果”,猜测以进行调试
打印余额(初始余额、四月、列表)[-1]
返回猜测
其他:
如果浮动(余额(初始余额、apr、listo)[-1])<-0.005:
猜测=猜测-(猜测/2)
打印“BOO”,猜测##进行调试
打印余额(初始余额、四月、列表)[-1]
其他:
猜测=猜测+(猜测/2)
打印“不”,猜测以便调试
打印余额(初始余额、四月、列表)[-1]
listo=月份*[猜测]
def testFindMonthlyPayment():
回答=发现每月付款(1000,18.9,60)
打印
myString=“在%.2f%%4月的%d个月内支付%.2f美元的月付款:”
打印myString%(1000,60,18.9)
打印“$%.2f%”答案
#输出应大致如下所示:
"""
迭代:1猜测:500.0最终余额:-46777.3384635
迭代:2猜测:250.0最终余额:-22111.7016729
迭代:3猜测:125.0最终余额:-9778.88327752
迭代:4猜测:62.5最终余额:-3612.47407985
迭代:5猜测:31.25最终余额:-529.269481021
迭代:6猜测:15.625最终余额:1012.3328184
迭代:7猜测:23.4375最终余额:241.5316687
迭代:8猜测:27.34375最终余额:-143.868906167
迭代:9猜测:25.390625最终余额:48.83138126
迭代:10猜测:26.3671875最终余额:-47.5187624535
迭代:11猜测:25.87890625最终余额:0.656309431
迭代:12猜测:26.123046875最终余额:-23.4312265251
迭代:13猜测:26.0009765625最终余额:-11.387458561
迭代:14猜测:25.9399414062最终余额:-5.36557457885
迭代:15猜测:25.9094238281最终余额:-2.35463258781
迭代:16猜测:25.8941650391最终余额:-0.84916159282
迭代:17猜测:25.8865356445最终余额:-0.0964260945206
迭代:18猜测:25.8827209473最终余额:0.27994165436
迭代:19猜测:25.8846282959最终余额:0.0917577799204
迭代:20猜测:25.8855819702最终余额:-0.00233415730086
在4月18日至90日的60个月内每月支付1000.00美元:
$25.89
"""

谢谢你的帮助。除非我在谷歌搜索到的所有东西都在stackoverflow上,否则我可能不会加入compsci。

这不是你平分的方式

guess = guess - (guess / 2)
通常你会保持低猜和高猜。你试试看

guess = (low_guess+high_guess)/2
然后根据结果,设置

low_guess = guess

重复


注意:在Python2中,如果分母和分子都是整数,则
/
是整数除法,因此最好确保初始的
猜测
是一个浮点

这不是平分的方式

guess = guess - (guess / 2)
def findMonthlyPayment(initialBalance, apr, months):
    """
    - initialBalance: the starting balance on the card.
    - apr: the APR.
    - months: the number of equal monthly payments you wish to
      make in order to reduce the balance to zero.
    - returns: the monthly payment amount needed to reduce the
      balance to zero (well, "zero" to within $0.005, anyway)
      in the given number of months.
    """
    low_guess = 0
    high_guess = initialBalance
    guess = float((low_guess + high_guess) / 2)
    listo = months*[guess]

    while True:

        if abs(float(balances(initialBalance, apr, listo)[-1])) < 0.006:
            print "BINGO", guess  ##for debugging
            print balances(initialBalance, apr, listo)[-1]
            return guess

        elif float(balances(initialBalance, apr, listo)[-1]) < -0.005:
            high_guess = guess
            print "BOO", guess ##for debugging
            print balances(initialBalance, apr, listo)[-1]

        else:
            low_guess = guess
            print "NAY", guess  ##for debugging
            print balances(initialBalance, apr, listo)[-1]
        guess = float((low_guess + high_guess) / 2)
        listo = months*[guess]
通常你都有一个
def findMonthlyPayment(initialBalance, apr, months):
    """
    - initialBalance: the starting balance on the card.
    - apr: the APR.
    - months: the number of equal monthly payments you wish to
      make in order to reduce the balance to zero.
    - returns: the monthly payment amount needed to reduce the
      balance to zero (well, "zero" to within $0.005, anyway)
      in the given number of months.
    """
    low_guess = 0
    high_guess = initialBalance
    guess = float((low_guess + high_guess) / 2)
    listo = months*[guess]

    while True:

        if abs(float(balances(initialBalance, apr, listo)[-1])) < 0.006:
            print "BINGO", guess  ##for debugging
            print balances(initialBalance, apr, listo)[-1]
            return guess

        elif float(balances(initialBalance, apr, listo)[-1]) < -0.005:
            high_guess = guess
            print "BOO", guess ##for debugging
            print balances(initialBalance, apr, listo)[-1]

        else:
            low_guess = guess
            print "NAY", guess  ##for debugging
            print balances(initialBalance, apr, listo)[-1]
        guess = float((low_guess + high_guess) / 2)
        listo = months*[guess]