在 Scheme (DrRacket) 中实现数学公式

Implementing a math formula in Scheme (DrRacket)

首先让我说,在 Scheme/Racket 方面我是一个完全的新手。我正在尝试实现以下公式:

αi = (3/h)((ai+1 – ai) – (ai – ai-1))

这是我定义函数的方式:

(define alpha_values (lambda (y_values h n) (...))

我想要它做的是 运行 具有 y_values 列表以及一些常量 h 和数字 n 的函数,然后计算return α 值的列表。 n 将从 1 变为 n-1,因此不会迭代列表的第一个和最后一个元素.

例如,如果y_values的列表是'(2 4 6 8)h1n3 那么应该有两个 α 值 returned:一个用于 i=1 (y=4),还有一个用于 i=2 (y=6),像这样:3*((6-4)-(4-2)) = 03*((8-6)-(6-4)) = 0 returns '(0 0) for α.

老实说,我什至不知道如何开始实施它。我考虑过使用 map 但我不知道这样做时是否可以跳过第一个和最后一个元素。我已经尝试使用 carcdr 递归地这样做,但是我 运行 进入 "losing" 的问题,这是在再次递归调用函数时计算所需的列表中的一个元素没有第一个元素。对于如何实施此公式,我将不胜感激 - 不是答案,只是关于如何让球滚动的想法。

每当您不确定如何解决特定问题时,请考虑将其分解为更易于管理、思考和实施的较小任务。

例如,从最终结果倒退,您想要生成一个 alpha 列表,其中每个 alpha 都是使用上述公式从 h 和一个区间 {a_i-1, a_i, a_i+1} 创建的。

因此,您可以创建一个小函数,我们称它为 compute-alpha,它以 intervalh 作为参数,然后使用公式生成 alpha。即:

(define (compute-alpha interval h)
  ...)

这个函数的主体就是公式,它的行为如下:

> (compute-alpha '(2 4 6) 1)
0
> (compute-alpha '(4 6 8) 1)
0

但随后您意识到您没有间隔(例如 '(2 4 6)'(4 6 8) 等)来使用 compute-alpha。所以下一步是定义另一个小函数,我们称之为 build-intervals,它将 y-valuesn 作为参数,并生成一个区间列表。即:

(define (build-intervals y-values n)
  ...)

行为如下:

> (build-intervals '(2 4 6 8) 3)
'((2 4 6) (4 6 8))
> (build-intervals '(1 2 3 4 5 6 7) 4)
'((1 2 3) (2 3 4) (3 4 5))

现在,剩下的就是对 build-intervals 产生的每个间隔应用 compute-alpha。这就是 map 的亮点:

(define (alpha-values y-values h n)
  (map (lambda (interval)
         (compute-alpha interval h))
       (build-intervals y-values n)))

那么你可以拥有:

> (alpha-values '(2 4 6 8) 1 3)
'(0 0)

一旦您实现了 build-intervalscompute-alpha,您可能会注意到将它们组合起来以将 alpha-values 简化为在生成之前仅迭代 y-values 一次的单个函数的方法alpha 列表。