2014-10-04 4 views
-1

Используйте накопительную рекурсию для записи функции, называемой update-balance, которая использует список транзакций, лотов, начальный баланс в начале месяца (считается днем ​​0), start-bal и неотрицательное число, представляющее минимальный баланс, min-bal. Функция выдает баланс банковского счета после завершения всех транзакций в партии.накопительная рекурсия, общая сумма транзакций

Имея проблемы с использованием накопительных рекурсий

(define (trans-val t start-bal min-bal) 
     (cond 
     [(symbol=? (trans-action t) 'withdraw) 
      (cond 
      [(>= (- start-bal (trans-amt t)) min-bal) 
      (- start-bal (trans-amt t))] 
      [else (- start-bal (+ 1 (trans-amt t)))])] 
     [else 
      (cond 
      [(>= (+ start-bal (trans-amt t)) min-bal) 
      (+ start-bal (trans-amt t))] 
      [else (+ start-bal (- (trans-amt t) 1))])])) 
+0

Вы процедура не является рекурсивным вообще. Он просто действует на одну транзакционную структуру 't'. Также вы можете уточнить, что должно произойти, если вы попытаетесь снять и получить баланс меньше, чем 'min-bal'. В этом коде вы просто добавляете 1 к нему и выходите в любом случае, я не уверен, что это то, что вы хотите. – Rptx

ответ

0

Может быть что-то вроде этого?

(define (update-balance lot start-bal min-bal) 
    (if (null? lot) 
     ; no more transactions to process -> return start-bal 
     start-bal 
     ; take next transaction (t), calculate new balance 
     (let* ((t (car lot)) 
      (new-bal ((if (eq? (trans-action t) 'withdraw) - +) 
         start-bal 
         (trans-amt t)))) 
     ; if new balance >= minimum balance, use that, otherwise retain previous balance 
     ; in any case, tail-recursively call update-balance to process the next transaction 
     (update-balance (cdr lot) 
         (if (>= new-bal min-bal) new-bal start-bal) 
         min-bal)))) 

Тестирование:

> (update-balance (list (trans 'deposit 100) (trans 'withdraw 80)) 0 0) 
20 
> (update-balance (list (trans 'deposit 10) (trans 'withdraw 80)) 0 0) 
10 
Смежные вопросы