Преобразуйте полином, представленный в виде списка коэффициентов, в строку

Я знаю, что это новый вопрос. Я пытаюсь создать функцию displayPoly для отображения полинома в схеме. Например, список, заданный как '(2 0 1 5.1 8), должен отображать 2x ^ 4 + x ^ 2 + 5.1x + 8.

Я определил "степень" следующим образом:

 (define degree
 (lambda(list)
  (if (null? list) 
      (- 1)
  (+ 1  (degree (cdr list))))))

Обратите внимание, что я строго ограничен функциями базовой схемы • define, lambda, if, cond, cons, car, cdr, list, member, list-ref • predicates: null? список? равный? нить? количество? член? • арифметические операторы, реляционные операторы, логические операторы • sort, map, filter, foldr, foldl, length, reverse, append, last, let, let *, letrec, print, begin, newline, display, expt, string-append, reduce , диапазон


person Mohammad Arshad    schedule 13.11.2016    source источник


Ответы (1)


Вам нужно написать несколько вспомогательных функций.

  1. Напишите функцию, которая по заданному многочлену возвращает список степеней.

    Вход: '(2 0 1 5.1 8) Выход: (4 3 2 1 0)

  2. Напишите функцию mono, которая с учетом коэффициента и степени выводит моном в виде строки.

    Вход: 2 4 Выход: «2x ^ 4»

  3. Используйте (map mono '(2 0 1 5.1 8) (4 3 2 1 0)), чтобы составить список одночленов.

  4. Используйте add-between (или напишите его сами), чтобы добавить «+» между всеми мономами.

  5. Используйте (apply string-append your-list-of-monomials), чтобы получить последнюю строку.

Примечание. Можно получить более красивый результат, но это хорошее начало.

person soegaard    schedule 13.11.2016
comment
Это предложение может создать проблему для отрицательных коэффициентов. например. (-1 2 -5) должно получиться -x^2 + 2x - 5. - person Sylwester; 13.11.2016
comment
Или (-1)x^2 + 2x + (-5), что не идеально, но, по крайней мере, правильно. - person soegaard; 13.11.2016
comment
@skywester способ отображения негативов не был проблемой. до тех пор, пока + отображается между ними. Во всяком случае, я заставил его работать с использованием рекурсии и отображения. Единственная проблема, с которой я столкнулся, заключалась в том, что он показывал 0. т.е. (5 0 3 -2 1) = 5x ^ 4 + 0x ^ 3 + 3x ^ 2 + -2x + 1. Я пытался сопоставить моно и фильтровать, но у меня было не повезло. Думаю, это нужно будет сделать. Спасибо :) - person Mohammad Arshad; 14.11.2016
comment
@MohammadArshad Если ответ помог, подумайте о том, чтобы принять ответ, нажав зеленую галочку. - person soegaard; 14.11.2016