如何使用累积(Scheme)求解以下等式

时间:2009-11-13 14:39:38

标签: scheme

我正在尝试执行以下问题(有一个公式,所以我打印筛选并上传它)

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))  但它不起作用......  换句话说,我不知道如何使用术语中的“下一个”(更改部分)。 (对不起,如果我解释得非常清楚 - 英语不是我的母语)

2 个答案:

答案 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