【发布时间】:2014-10-02 22:16:13
【问题描述】:
我正在尝试实现一个这样定义的函数:
f(n) = n if n < 4
f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3) + 4f(n - 4) if n >= 4
执行此操作的迭代方法是从底部开始,直到我点击n,所以如果 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),而是将其放在
f(4) = 10中 - 理想情况下,我想从 0 开始
result,从 3 开始counter,以便将计算应用于m1到m4(这样实际上将计算出f(4)而不是预设) , 但随后0在下一次迭代中被用于 m1,而它应该是f(4)的结果 (10)
tl;dr 结果计算被延迟,或者结果本身被延迟。我怎样才能正确地写这个?
【问题讨论】: