Scheme 从列表中添加术语的方案

Scheme 从列表中添加术语的方案,scheme,Scheme,我正在写一个对多项式进行运算的scheme程序。我目前正在研究一种结合所有类似术语的方法。例如,如果我有一个多项式:1x^2+2x^2+4x^3,函数应该组合类似的术语1x^2和2x^2,并输出最终的多项式3x^2+4x^3。它使用递归 我首先对多项式进行排序。然后,如果长度为零,则不执行任何操作。我调用了另一个函数,它检查指数是否相等,如果相等,我将这两个项相加,然后遍历列表 我遇到的问题是: 当我检查两项是否相等时,我将它们相加。一旦我这样做了,我就不知道如何将其添加到原始列表中,并在进行递

我正在写一个对多项式进行运算的scheme程序。我目前正在研究一种结合所有类似术语的方法。例如,如果我有一个多项式:1x^2+2x^2+4x^3,函数应该组合类似的术语1x^2和2x^2,并输出最终的多项式3x^2+4x^3。它使用递归

我首先对多项式进行排序。然后,如果长度为零,则不执行任何操作。我调用了另一个函数,它检查指数是否相等,如果相等,我将这两个项相加,然后遍历列表

我遇到的问题是:

当我检查两项是否相等时,我将它们相加。一旦我这样做了,我就不知道如何将其添加到原始列表中,并在进行递归调用时传递该列表。我知道我应该用“cons”来添加到列表的前面。我知道我应该使用cdr(cdr列表)来跳过我已经添加的两个术语

如何在函数中创建新列表以添加到原始列表中?。这就是我到目前为止所做的。有些不起作用。(尝试了不同的东西)我一直坚持的是当我创建“a”和“b”并打印它们的时候。我不想打印它们,而是想把它们放在一个列表中,这样我就可以将其与原始列表进行对比。注释部分用中间的“CONS”部分(分号注释)是我至今所尝试的。这就是我的列表的定义。第一项是系数,第二项是指数。示例:(23)系数=2,指数=3

    (define p1 '((2 3)(3 2)(5 2)))

    (define (simplify p)
    (sort p GT)
    (cond [(= (length p) 0) (print 0)]
    [(= (length p) 1) (printpoly p)]
    [
     (if(EQExp? (car p) (cadr p))
     (let([a (+ (coeff (car p)) (coeff (cadr p)))])
     (let([b (expon (cadr p))])
     (print a)
     (display "x^")
     (print b)
       (printpoly(car([list '((a b))])))
     ; (printpoly y)
     ; (cons (cons ('(a) '(expon (cdr p)))) p)
     ; (cons  y p)
     ;(print (expon (car p)))
     (set! p (cdr p))
     (simplify p)
         )
       ;)
     )
     (if(> (length p) 1)
      ((printTerm (car p))
      (display " + ")
      (set! p (cdr p))
      (simplify p))
      ((=(length p) 1)
       (set! p (cdr p))
       (simplify p)
      )
      )
     )
     ]
     [else
     (set! p (cdr p))
     (simplify p)
     ]
     )
     )

多项式运算可能很复杂,因此将任务分解为许多小运算非常重要。特别是,您需要有一个单独的函数来打印多项式。下面您将看到simplify如何用相同的指数替换这两个项。缺少的是打印多项式的函数

(define the-zero-polynomial '())

(define (exponent t) ; t stands for term
  (second t))

(define (coef t) ; t 
  (first t))

(define (same-degree? t1 t2)
  (or (equal? t1 t2)
      (and (not (null? t1)) (not (null? t2))
           (= (exponent t1) (exponent t2)))))

(define p1 '((2 3) (3 2) (5 2)))

(define (simplify p) ; p is unsorted
  (simplify-sorted (sort p GT)))

(define (simplify-sorted p)
  (cond 
    [(= (length p) 0) the-zero-polynomial]
    [(= (length p) 1) p]
    [else
     ; now p = (list t1 t2 t ...)
     (let ([t1 (first p)] [t2 (second p)])
       (cond
         [(same-degree? t1 t2)
          ; same degree, replace (list t1 t2 t ...) 
          ; with                 (list t1+t2 t ...)
           (let ([t1+t2 (list (+ (coef t1) (coef t2))
                              (exponent t1))])
             (simplify-sorted (cons t1+t2 (cddr p))))]
         [else
          (cons t1 (simplify (cdr p)))]))]))

非常感谢你。这个计划很难学。我花了6个多小时研究这个方法。但现在一切都有意义了。我已经有了打印方法。我只需要做一些小的修改和添加一些东西,使打印工作。我一定记得把一个方法分解成更小的方法。:)