Как решить следующее уравнение, используя метод накапливания (схема) - PullRequest
2 голосов
/ 13 ноября 2009

Я пытаюсь решить следующую проблему (есть формула, поэтому я распечатал и загрузил ее)

Формула http://img248.imageshack.us/img248/6558/problemh.jpg
(http://img248.imageshack.us/img248/6558/problemh.jpg)

Использование накопления:

(define (accumulate combiner null-value term a next b) (if (> a b) null-value (combiner (term a) (accumulate combiner null-value term (next a) next b))))

но я почти не знаю, как это сделать. Это должно выглядеть примерно так (define (sum-func f k)...? Я не уверен, как мне определить f (x + j * h), чтобы поместить в него изменяющееся число j (изменяется от 0 до заданного числа k) ... Другими словами, я довольно потерян.


Спасибо за быстрый ответ. Я учусь на среднесрочные и пытаюсь сделать промежуточные с предыдущих лет, но я просто застрял здесь. Я знаю, как использовать накопление и все в нем, но я просто не знаю, как сделать f (x + jh). Я пытаюсь это: (define (sum-func term a b h x) (define (next a) (+ a 1)) (define (term a) (term (+ x (* h a)))) (accumulate + 0 (term a) a (next a) b)) Но это не работает ... Другими словами, я не знаю, как использовать «следующий» (изменяющаяся часть) внутри термина. (извините, если я объясняю очень четко - английский не мой родной)

Ответы [ 2 ]

2 голосов
/ 14 ноября 2009

Я понял это. Думаю, я переосмыслил алгоритм (думая, что он намного сложнее, чем был), и это привело меня ко многим глупым ошибкам.

(define (accumulate combiner null-value term a next b)


(if (> a b) null-value


(combiner 
      (term a)
      (accumulate combiner null-value term (next a) next b))))


(define (sum-row term x h n)

  (accumulate + 0
              (lambda (t) (* (if (even? (- n t)) 1 -1)(term (+ x(* h t))))) 
              0 
              (lambda (t) (+ t 1))
              n))


(define (square x) (* x x))

(sum-row square 2 2 3)

; -4+16-36+64=40
; -f(2+0*2)=-4 f(2+1*2)=16 -f(2+2*2)=-36 f(2+3*6)=64
2 голосов
/ 13 ноября 2009

Я не уверен, является ли это домашним заданием или нет, но в любом случае я дам вам несколько идей о том, как ее решить. Для простоты предположим, что наша задача - найти сумму квадратов всех чисел между j и k. Вы можете использовать свою функцию накопления выше, чтобы решить эту простую проблему. Все, что вам нужно сделать, это определить свой комбинатор, термин и следующие функции для этой задачи, а также определить окончательное нулевое значение.

Термин функция здесь должен вычислять квадраты для каждого j. Следовательно, term примет j в качестве аргумента и вернет квадрат j в качестве результата. (определить (термин j) (sqr j))

Следующая функция должна получить следующий j в последовательности. (определить (далее j) (+ j 1)

Функция объединителя должна объединять два термина вместе. (определить (объединитель t1 t2) (+ t1 t2))

Наконец, нулевое значение означает условие остановки, последнее значение, которое должно быть передано объединителю, когда мы накопили все значения от j до k. Все, что нам нужно сделать, это просто определить его как ноль в этом случае. (определить нулевое значение 0)

В вашей задаче большинство этих функций одинаковы, за исключением термина «функция». В этой задаче термин функция был очень простым, он просто нашел квадрат предоставленного числа. Однако в вашем случае это не так просто, как найти квадрат j, так как у вас есть несколько других определенных констант.

Надеюсь, это поможет вам решить проблему.

Если вам нужно еще больше разобраться в этом, вы можете взглянуть на накопившиеся проблемы в главе 2 SICP.

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