Вычислить арифметическую сумму постоянной последовательности разницы


3.1

Написать программу, которая вычисляет арифметическую сумму постоянной последовательность разница:

D0 = A
Dn+1 = Cdn + B

Выполните следующие значения и сравнить с закрытым форме:

Maximum index = 10,000, a = 1:0; c = 5; b = 2^-15

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

(defun d-n-plus-1 (d-n c b) (+ (* d-n c) b))

(defun d-depth (depth d-n c b a)
  (if (equal depth 0) (d-n-plus-1 d-n c b)
    (d-depth (1- depth) 
         (if (null d-n) a (d-n-plus-1 d-n c b)) 
         c b a)))

(format t "result: ~a ~%" (d-depth 10000 nil 5 (expt 2 -15) 1))

Кроме того, я написал версию, которая просто использует цикл. Я не сумасшедший о "петли для X от 1 до глубина" или что я использовал setq в этой версии. Можете вы придумать лучший способ? Любые другие предложения для этой версии также приветствуются.

(defun d_n+1 (d_n c b) (+ (* d_n c) b)) 

(defun d-depth (depth d_n c b)
  (loop for x from 0 to depth do 
    (setq d_n (d_n+1 d_n c b))) 
  d_n)

(format t "result: ~a ~%" (d-depth 10000 1 5 (expt 2 -15)))


437
3
задан 17 марта 2011 в 05:03 Источник Поделиться
Комментарии
1 ответ

Я заметил три вещи о вашем коде:


  1. Вы полагаетесь на хвост-рекурсия. Это хорошо, если вы знаете, ваша программа будет только работать на реализациях, которые выполняют оптимизация хвостовой вызов, но вы должны знать, что единого стандарта Лиспа не требует ТСО (и более практической точки зрения некоторых реализациях действительно не предлагает). Так что если вы хотите, чтобы ваши программы, чтобы быть портативный, вы должны переписать его с помощью loop1.

  2. Ваш д-Глубина функция принимает д-н и в качестве параметров, а только использует себя в место г-н Ли г-н - это Нил. Это сделало бы больше смысла для меня, чтобы удалить один параметр и вместо того, чтобы передать это значение в качестве начального значения для г-н (вместо нуля).

  3. Я хотел также написать d_n вместо д-п , чтобы подчеркнуть, что Н - это индекс, который обычно написаны с использованием символа подчеркивания в ASCII. Также я бы назвал д-н-плюс-1 d_n+1 вместо этого, нет никаких причин, чтобы заклинание "плюс" на Лиспе.


В ответ на ваши обновления:


Я не сумасшедший о "петли для X от 1 до глубина" или что я использовал setq в этой версии. Можете вы придумать лучший способ?

для X от 1 до глубина эквивалентно повторить глубина (если вы на самом деле использовать х, которых у вас нет). Однако в вашем коде, вы на самом деле начиная с 0, а не 1, поэтому вам нужно повторить (+ 1 х) , чтобы получить такое же количество повторений.

В setq можно заменить с помощью дисп = запуск после замены-форма синтаксиса. Результатом будет что-то вроде этого:

(defun d-depth (depth a c b)
(loop repeat (+ 1 depth)
for d_n = a then (d_n+1 d_n c b)
finally (return d_n)))


1 или в схеме :Р

2
ответ дан 17 марта 2011 в 05:03 Источник Поделиться