Реализация математической формулы в Схеме (DrRacket) - PullRequest
0 голосов
/ 06 мая 2018

Позвольте мне начать с того, что я начинающий, когда дело доходит до Схемы / Ракетки. Я пытаюсь реализовать следующую формулу:

α i = (3 / ч) ((a i + 1 - a i ) - (a i - i-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, но столкнулся с проблемой "потери" элемента в списке, необходимого для вычисления, при рекурсивном вызове функции снова без первого элемента. Я был бы признателен за понимание того, как подойти к реализации этой формулы - не ответ, а просто идея о том, как добиться успеха.

1 Ответ

0 голосов
/ 06 мая 2018

Всякий раз, когда вы не знаете, как решить конкретную проблему, рассмотрите ее в разбивке на более мелкие задачи, которыми легче управлять, думать и реализовывать.

Например, возвращаясь назад от конечного результата, вы хотите создать список альф, в котором каждая альфа создается из 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 только один раз перед созданием списка альфа.

...