Схема / Простые вопросы рекурсии - PullRequest
0 голосов
/ 27 марта 2012

В Конкретные абстракции , есть этот пример рекурсии:

(define subtract-the-first (lambda (n)
                             (if (= n 0) 0
                                 (- (subtract-the-first (- n 1)) n))))

Это я понимаю.Например, если n = 3, эта функция оценивается следующим образом: (- (+ (+ (+ 1) 2) 3)) -> -6

Однако в одном из последующих примеров предполагается объяснить, почему невозможно изменить порядокопераций.Например, давайте посмотрим на это:

(define subtract-the-first2 (lambda (n)
                             (if (= n 0) 0
                                 (- n (subtract-the-first2 (- n 1))))))

Если я позвоню (subtract-the-first2 4), результат будет равен 2. Однако я не совсем понимаю оценку.Очевидно, я здесь ошибаюсь, потому что вижу это: (- 4 (+ 3 (+ 2 (+ 1))) ), что равно (- 4 6) и, таким образом, оценивается как -2.

Я ценю любые указатели, так как я бью себя по головестены уже полчаса или около того ...

Спасибо!

1 Ответ

2 голосов
/ 27 марта 2012

Вы можете проверить оценку этой функции, добавив semiquote s и unquote s:

(define subtract-the-first2 (lambda (n)
                              (if (= n 0) 0
                                `(- ,n ,(subtract-the-first2 (- n 1))))))

Тогда оцените:

> (subtract-the-first2 4)
(- 4 (- 3 (- 2 (- 1 0))))

Это оценивается как 2. (Не понимаю, откуда у тебя плюсы ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...