Я пытаюсь реализовать функцию, определенную как таковые:расчета Итерационного дерева в схеме
f(n) = n if n < 4
f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3) + 4f(n - 4) if n >= 4
Итерационный способ сделать это было бы начать на дне, пока я не попал n
, так что если п = 6 : попытка
f(4) = (3) + 2(2) + 3(1) + 4(0) | 10
f(5) = f(4) + 2(3) + 3(2) + 4(1) | 10 + 16 = 26
f(6) = f(5) + 2f(4) + 3(3) + 4(2) | 26 + 2(10) + 17 = 63
Реализация:
; m1...m4 | The results of the previous calculations (eg. f(n-1), f(n-2), etc.)
; result | The result thus far
; counter | The current iteration of the loop--starts at 4 and ends at n
(define (fourf-iter n)
(cond [(< n 4) n]
[else
(define (helper m1 m2 m3 m4 result counter)
(cond [(= counter n) result]
[(helper result m1 m2 m3 (+ result m1 (* 2 m2) (* 3 m3) (* 4 m4)) (+ counter 1))]))
(helper 3 2 1 0 10 4)]))
Несколько проблем:
- Возвращаемый результат один итерации меньше, чем это должно быть, потому что фактические расчеты не происходят не до рекурсивного вызова
- Вместо того, чтобы использовать определенный алгоритм для вычисления F (4), I «м просто положить его прямо там, что
f(4) = 10
- в идеале я хочу начать
result
на 0 иcounter
на 3, так что расчеты применяются кm1
черезm4
(и так, чтоf(4)
фактически рассчитывается из вместо того, чтобы быть предварительно) , но затем0
будет использоваться для m1 в следующей итерации п, когда оно должно быть результатомf(4)
вместо (10
)
TL; либо результат вычисления др задерживается, или сам результат задерживается. Как я могу написать это правильно?
Связанный: http://stackoverflow.com/questions/26080321/why-am-i-getting-application-not-a-procedure – Jack