方案从列表中添加术语
Scheme Adding Terms from lists
我正在编写一个方案程序来执行多项式运算。我目前正在研究一种结合所有相似术语的方法。例如,如果我有多项式:1x^2 + 2x^2 + 4x^3,该函数应结合类似项 1x^2 和 2x^2 并输出最终多项式 3x^2 + 4x^3。它使用递归。
我先对多项式进行排序。然后,如果长度为零,什么也不做。我调用了另一个函数来检查指数是否相等,如果相等,则我将这两项相加,然后遍历列表。
我遇到的问题是:
当我检查两项是否相等时,我会将它们相加。执行此操作后,我无法弄清楚如何将其添加到原始列表并在进行递归调用时传递该列表。我知道我应该使用 "cons" 添加到列表的前面。我知道我应该使用 cdr(cdr list) 来跳过我已经添加的两个术语。
如何在函数内创建一个新列表以添加到原始列表中?。这是我到目前为止所做的。其中一些不起作用。 (正在尝试不同的东西)我坚持的部分是当我创建 'a' 和 'b' 并打印它们时。我不想打印它们,而是想将它们放在一个列表中,以便我可以将其与原始列表结合使用。中间有 'cons' 东西的注释掉的部分(注释用分号)是我到目前为止所尝试的。这就是我的列表的定义方式。第一项是系数,第二项是指数。示例:(2 3) 系数 = 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)))]))]))
我正在编写一个方案程序来执行多项式运算。我目前正在研究一种结合所有相似术语的方法。例如,如果我有多项式:1x^2 + 2x^2 + 4x^3,该函数应结合类似项 1x^2 和 2x^2 并输出最终多项式 3x^2 + 4x^3。它使用递归。
我先对多项式进行排序。然后,如果长度为零,什么也不做。我调用了另一个函数来检查指数是否相等,如果相等,则我将这两项相加,然后遍历列表。
我遇到的问题是:
当我检查两项是否相等时,我会将它们相加。执行此操作后,我无法弄清楚如何将其添加到原始列表并在进行递归调用时传递该列表。我知道我应该使用 "cons" 添加到列表的前面。我知道我应该使用 cdr(cdr list) 来跳过我已经添加的两个术语。
如何在函数内创建一个新列表以添加到原始列表中?。这是我到目前为止所做的。其中一些不起作用。 (正在尝试不同的东西)我坚持的部分是当我创建 'a' 和 'b' 并打印它们时。我不想打印它们,而是想将它们放在一个列表中,以便我可以将其与原始列表结合使用。中间有 'cons' 东西的注释掉的部分(注释用分号)是我到目前为止所尝试的。这就是我的列表的定义方式。第一项是系数,第二项是指数。示例:(2 3) 系数 = 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)))]))]))