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



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

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

以下是我定义函数的方式:

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

我希望它做的是使用y_values列表以及一些常量h和数字n运行函数,然后计算并返回α值的列表。n将从1变为n-1,因此不会迭代列表的第一个和最后一个元素。

例如,如果y_values列表为'(2 4 6 8)h为 1,n3,则应该返回两个α值:一个用于 i=1 (y=4(,一个用于i=2(y=6(,如下所示:3*((6-4(-(4-2(( = 0 和 3*((8-6(-(6-4(( = 0 返回α'(0 0)

老实说,我不知道如何开始实施这一点。我想过使用map但我不知道是否可以在这样做时跳过第一个和最后一个元素。我尝试使用carcdr递归地执行此操作,但是在没有第一个元素的情况下再次递归调用函数时,我遇到了"丢失"计算所需列表中的元素的问题。我希望对如何实施这个公式有一些见解——不是答案,只是关于如何让球滚动的想法。

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

例如,从最终结果向后看,您希望生成一个 alpha 列表,其中每个 alpha 都是根据h创建的,并使用注明的公式{a_i-1, a_i, a_i+1}区间。

因此,您可以创建的一个小函数是函数,我们将其称为compute-alpha,它将间隔和h作为参数,然后使用公式生成 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简化为一个函数,该函数在生成alpha列表之前只迭代y-values一次。

最新更新