Я пытаюсь выяснить, как включить 3 переменные в мой код хвостовой рекурсии для ракетки - PullRequest
1 голос
/ 12 апреля 2019

Напишите хвостовую рекурсивную функцию popadd, которая моделирует население с P людьми в момент времени t = 0 и добавляет d человек в год.

(define (popadd t  P)
  (if (= t 0)
      P
  (+(popadd( - t 1) P)d)) 
)

, но, конечно, я получаю ошибку, которую d hasnеще не определено, что является правдой.Я попытался добавить его в качестве входных данных, но в качестве возврата я получаю число, вставленное для D.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

Вы можете просто передать другой параметр в рекурсию:

(define (popadd t P d)
  (if (= t 0)
      P
      (+ d (popadd (- t 1) P d))))

Или вы можете определить значение, чтобы избежать его передачи - при условии, что его не нужно менять:

(define d 100)

(define (popadd t P)
  (if (= t 0)
      P
      (+ d (popadd (- t 1) P))))

Обратите внимание, что вы можете сделать то же самое с P, если все в порядке. Это действительно зависит от ожидаемого контракта на процедуру.

2 голосов
/ 12 апреля 2019

Обратите внимание, что ни ваш код, ни код в другом ответе не являются хвостово-рекурсивными: в рекурсивном вызове, таком как (+ (f ...)), f не находится в хвостовой позиции. Чтобы сделать код хвостовым рекурсивным, необходимо, чтобы результат рекурсивного вызова был результатом общего вызова (поэтому в приведенном выше примере + равно в хвостовой позиции). Для этого вам понадобится вспомогательная функция. Вот способ сделать это, который опирается только на локальный define:

(define (popadd t P d)
  (define (popadd-loop tau pop)
    (if (zero? tau)
        pop
        (popadd-loop (- tau 1) (+ pop d))))
  (popadd-loop t P)) 

Здесь, по сути, то же самое, используя named- let, что лучше:

(define (popadd t P d)
  (let popadd-loop ([tau t] [pop P])
    (if (zero? tau)
        pop
        (popadd-loop (- tau 1) (+ pop d)))))

Наконец, обратите внимание, что эта проблема имеет решение в закрытой форме:

(define (popadd t P d)
  (+ P (* t d)))

Я действительно желаю , чтобы люди, пытающиеся преподавать программирование, знали достаточно математики, чтобы не ставили задачи, которые имеют тривиальные ответы в замкнутой форме, поскольку это побуждает людей писать неэффективно (в код сложности). Очевидно, это не твоя вина: это твоя учительница.

...