Создание функции оценки в ракетке - PullRequest
0 голосов
/ 22 марта 2020

enter image description here Пример того, что должна делать функция: (список 3 4 6 9 7) ← → 3x ^ 4 + 4x ^ 3 + 6x ^ 2 + 9x + 7

Что у меня пока есть:

(define (poly-eval x numlist)
(compute-poly-tail x numlist 0 0))

(define (compute-poly-tail xn list n acc)
    (cond
      [(null? list) acc]
    [else (compute-poly-tail (first list) (rest list)
                       (+ acc (* (first list) (expt xn n))) (+ n 1))]))



(check-expect(poly-eval 5 (list 1 0 -1)) 24)
(check-expect(poly-eval 0 (list 3 4 6 9 7)) 7)
(check-expect(poly-eval 2 (list 1 1 0 1 1 0))  54)

Ожидаемые результаты:

(check-expect(poly-eval 5(list 1 0 -1)) 24)
(check-expect(poly-eval  0 (list 3 4 6 9 7))7)
(check-expect(poly-eval 2 (list 1 1 0 1 1 0)) 54)

Я получаю ошибку во время выполнения. Может кто-то заметит, что я делаю не так. Я не знаю, почему я получаю эти результаты.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

В коде есть пара ошибок:

  • Вам необходимо обработать список коэффициентов в правильном порядке, соответствующем их положению в полиноме! Вы можете:
    • reverse составить список с начала и обработать коэффициенты справа налево (проще).
    • Или начать n через (sub1 (length numlist)) и уменьшить это на каждой итерации (это то, что я делал).
  • Порядок и значение аргументов при вызове рекурсии в compute-poly-tail неверны, проверьте определение процедуры, сделайте убедитесь, что вы передаете значения в том же порядке, в котором вы их определили, также первый вызов (first list) не имеет никакого смысла.
  • Не следует указывать list параметр, это будет sh со встроенной процедурой с таким же именем. Я переименовал его в lst.

Это должно исправить проблемы:

(define (poly-eval x numlist)
  (compute-poly-tail x numlist (sub1 (length numlist)) 0))

(define (compute-poly-tail xn lst n acc)
  (cond
    [(null? lst) acc]
    [else (compute-poly-tail xn
                             (rest lst)
                             (- n 1)
                             (+ acc (* (first lst) (expt xn n))))]))

Работает как положено:

(poly-eval 5 (list 1 0 -1))
=> 24

(poly-eval 0 (list 3 4 6 9 7))
=> 7

(poly-eval 2 (list 1 1 0 1 1 0))
=> 54
1 голос
/ 23 марта 2020

Создайте коэффициент мощности и неизвестный список, чем используйте функцию карты.

; 2*3^1+4*3^0
; input is 3 and '(2 4)
; we need '(3 3) '(2 4) '(1 0)
; use map expt build '(3^1 3^0)
; use map * build '(2*3^1 4*3^0)
; use foldr + 0 sum up

(define (poly-eval x coefficient-ls)
  (local ((define power-ls (reverse (build-list (length coefficient-ls) values)))
          (define unknown-ls (build-list (length coefficient-ls) (λ (i) x))))
    (foldr + 0 (map * coefficient-ls (map expt unknown-ls power-ls)))))


...