2015-09-06 4 views
0

Вопрос заключается в том, чтобы найти фиксированную сумму, которую нужно заплатить, чтобы компании кредитных карт, когда -касается не изменяя значения из N

  • BAL = сумма, которую вы должны заплатить в начале 0-й месяц
  • N = это ежемесячная фиксированная сумма, подлежащая платному компании кредитной карты таким образом, что в конце года вы заплатили общее количество до
  • Int = процентной ставки кредитной карточки компании
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) 

Мой код никогда не заканчивается. Проблема в том, что значение N, определенное в коде, не меняется. Он остается фиксированным N = upper_b + lower_b)/2

+0

Это не является хорошим примером использования рекурсии –

+1

Уходя @PadraicCunningham комментарий, я бы не использовать рекурсию, а не использовать глобальные переменные. Я думаю, что это то место, где вы спотыкаетесь. Возьмите вход пользователя и отправьте его функции. Вы можете в конечном итоге использовать функцию обертки, но иногда это проще, чем рекурсия с глобалями. –

ответ

0

Использование рекурсии не было бы идеальным подходом, у вас также есть логические ошибки, в том числе необходимость получить процентную ставку за месяц, ваша начальная верхняя граница должна быть больше основной плюс интерес. Вы можете использовать время цикла с внутренним контуром для сброса баланса после каждого неудачного внутреннего цикла:

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)) 
+1

Я сделал более или менее ту же программу, что и ваша .. 'bal = int (raw_input (" ")) rate = float (raw_input (" ")) up = (bal + bal * rate)/12 print до низкого = BAL/12 заплатил = (до + минимум)/2 печати заплатил четкости кредит (BAL, скорость, вверх, низкий, платные): new_b = BAL в то время как абс (new_b)> 100: new_b = BAL для г в диапазоне (12): new_b = new_b + (new_b * скорость/12) new_b = new_b - заплатил , если (new_b> 0): вверх = заплатил еще: низкое = заплатил paid = (вверх + низкий) /2.0 return paid print Кредит (бал, ставка, вверху, низкая, уплаченная) ' –

Смежные вопросы