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

问题描述 投票:1回答:1

让我首先说一下,当涉及到Scheme / Racket时,我是一个完整的新手。我正在尝试实现以下公式:

αi=(3 / h)((ai + 1 - αi) - (ai - 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,但我不知道是否可以跳过第一个和最后一个元素。我尝试使用carcdr递归这样做,但我遇到了“丢失”计算所需的列表中的元素的问题,在没有第一个元素的情况下再次递归调用该函数。我很欣赏一些关于如何实现这个公式的见解 - 不是答案,只是关于如何让球滚动的想法。

scheme racket map-function
1个回答
3
投票

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

例如,从最终结果开始向后,您需要生成一个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))

现在,剩下的就是在compute-alpha生成的每个区间上应用build-intervals。这就是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一次。

© www.soinside.com 2019 - 2024. All rights reserved.