Search code examples
pythoncanopy

Regarding not changing value of N


The question is to find the fixed amount you need to pay to a credit card company when -

  • bal= the amount you need to pay at the beginning of 0th month
  • N = it is the monthly fixed amount to be to paid to the credit card company such that at the end of the year, you will have paid the total amount
  • int = interest rate of the credit card company
bal = int(raw_input("Enter balance"))
rate = int(raw_input("enter rate"))
lower_b = bal/12
upper_b = (bal + ((rate*bal)/1200))/12
N= (lower_b+upper_b)/2
def Credit(bal,rate,N):
        global upper_b
        global lower_b
        i=1
        k=bal
        while (i<13):
            print(N)
            paid = N
            bal = bal - paid
            print("Balance remains to be paid is %s" %(round(bal,2)))
            Interest = rate * bal /1200
            print("The interest added on is %s" %(round(Interest,2)))
            bal=bal+Interest
            print ("The amount that needs to be payed is %s " %(round(bal,2)))
            i=i+1

        if bal==0:
            return N
        elif  50 < bal < 2000 :
            lower_b = N
            upper_b = upper_b
            N = (upper_b +lower_b)/2
            return Credit(k,rate,N)
        elif -2000<bal< -50:
            upper_b = N
            lower_b = lower_b
            N = (lower_b +upper_b)/2
            return Credit(k,rate,N)
        elif  -50 < bal < 50:
            return N 
        else:
            return bal


result=Credit(bal,rate,N)
print(result)

My code never terminates. The problem is the value of N defined in the code is not changing. It remains fixed N = upper_b +lower_b)/2


Solution

  • Using recursion would not be the ideal approach, you also have logic errors including needing to get the interest rate for the month, your initial upper bound should be greater than the principal plus the interest. You can use a while loop with an inner for loop resetting the balance after each unsuccessful inner loop:

    balance = int(raw_input("Enter balance"))
    int_rate = float(raw_input("enter rate"))
    int_rate /= 100
    lower_b = balance / 12.
    upper_b = ((balance * (1 + (int_rate / 12.0)) ** 12) / 12.0)
    payment = (lower_b + upper_b) / 2
    def Credit(bal, rate, low, high, pay):
        new_b = bal
        # calculate monthly interest rate
        month_int = rate / 12
        while abs(new_b) > 0.001:  # use epsilon 
            # always reset balance
            new_b = bal
            for _ in range(12):  # loop over 12 month range
                new_b -= pay  # deduct pay
                new_b += month_int * new_b
            # if we still have a balance we need to take more so set low to current payment
            if new_b > 0:
                low = pay
            # else we took to much so set high to current payment
            else:
                high = pay
            pay = (low + high) / 2.0
        return "Lowest monthly payment over 12 months: {}".format(pay)
    
    
    print(Credit(balance, int_rate, lower_b, upper_b, payment))