我正在尝试执行以下问题(有一个公式,所以我打印筛选并上传它)
Formula http://img248.imageshack.us/img248/6558/problemh.jpg
(http://img248.imageshack.us/img248/6558/problemh.jpg)
使用accumulate:
(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))
但它不起作用......
换句话说,我不知道如何使用术语中的“下一个”(更改部分)。
(对不起,如果我解释得非常清楚 - 英语不是我的母语)
答案 0 :(得分:2)
我不确定这是否是家庭作业问题,但无论如何我都会就如何解决这个问题向您提供一些想法。为简单起见,我们假设我们的问题是找到j和k之间所有数字的平方和。您可以使用上面的累积函数来解决这个简单的问题。您所要做的就是为此问题定义组合器,术语和下一个函数,并定义最终的空值。
这里的术语函数应该计算每个j的平方。因此术语将j作为参数&将返回j的平方作为结果。 (定义(术语j)(sqr j))
下一个函数应该得到序列中的下一个j。 (定义(下一个j)(+ j 1)
组合器功能应将两个术语组合在一起。 (定义(组合器t1 t2)(+ t1 t2))
最后,null-value表示停止条件,当我们累积了从j到k的所有值时,应该传递给组合器的最后一个值。我们所要做的就是在这种情况下将其定义为零。 (定义null-value 0)
对于您的问题,除术语功能外,大部分功能都相同。 在这个问题中,术语函数是一个非常简单的函数,它只是找到了所提供数字的平方。但是,在你的情况下,它并不像找到j的平方那么简单,因为你已经定义了其他几个常量。
希望这可以帮助您解决问题。
如果您需要更深入地了解这一点,您可能需要查看SICP第2章中的累积问题。
答案 1 :(得分:2)
我明白了。我想我是在思考algorythm(认为它比它复杂得多),这让我犯了许多愚蠢的错误。
(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