首先,我要说的是,在方案/球拍方面,我是一个完全的新手。我正在尝试实现以下公式:
α 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,n
为3,则应该返回两个α值:一个用于 i=1 (y=4(,一个用于i=2(y=6(,如下所示:3*((6-4(-(4-2(( = 0 和 3*((8-6(-(6-4(( = 0 返回α'(0 0)
。
老实说,我不知道如何开始实施这一点。我想过使用map
但我不知道是否可以在这样做时跳过第一个和最后一个元素。我尝试使用car
和cdr
递归地执行此操作,但是在没有第一个元素的情况下再次递归调用函数时,我遇到了"丢失"计算所需列表中的元素的问题。我希望对如何实施这个公式有一些见解——不是答案,只是关于如何让球滚动的想法。
每当您不确定如何处理特定问题时,请考虑将其分解为更易于管理、思考和实施的较小任务。
例如,从最终结果向后看,您希望生成一个 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-values
和n
作为参数,并生成一个区间列表。即:
(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-intervals
和compute-alpha
,你可能会注意到将它们组合在一起的方法,以将alpha-values
简化为一个函数,该函数在生成alpha列表之前只迭代y-values
一次。