Всякий раз, когда вы не знаете, как решить конкретную проблему, рассмотрите ее в разбивке на более мелкие задачи, которыми легче управлять, думать и реализовывать.
Например, возвращаясь назад от конечного результата, вы хотите создать список альф, в котором каждая альфа создается из h
и интервала {a_i-1, a_i, a_i+1}
с использованием отмеченной формулы.
Таким образом, одна небольшая функция, которую вы можете создать, - это функция, давайте назовем ее compute-alpha
, которая принимает интервал и h
в качестве аргументов, а затем генерирует альфа с использованием формулы. То есть:
(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))
Теперь все, что осталось, - это применение 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-intervals
и compute-alpha
, вы можете заметить, как можно объединить их, чтобы уменьшить alpha-values
до одной функции, которая повторяет y-values
только один раз перед созданием списка альфа.