【问题标题】:Creating an evaluate function in racket在球拍中创建评估函数
【发布时间】:2020-03-22 20:50:05
【问题描述】:

应该做什么功能的例子: (列表 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)

我收到运行时错误。有人可以发现我做错了什么。我不知道为什么我会得到这些结果。

【问题讨论】:

  • 我不明白 xn 参数在做什么。它以x 开头,所以我希望它始终保持与x 相同的值,但在递归调用中它得到(first list)。那后面的条款怎么还知道x是什么?
  • 接下来我不明白的是nn 从零开始,但对于最重要的多项式,我希望 n 以多项式的次数开始,就像它是 x^2 + 2*x + 1 我希望 n 开始作为2,每次递归调用都会下降一个
  • 那么你把acc 作为最后一个参数,所以我猜(+ acc ....) 表达式也应该去,因为最后一个参数是递归调用

标签: scheme racket


【解决方案1】:

代码中有几个错误:

  • 您需要以正确的顺序处理系数列表,对应于它们在多项式中的位置!您可以:
    • reverse从头开始列表,从右到左处理系数(更简单)。
    • 或者在 (sub1 (length numlist)) 中启动 n 并在每次迭代时减少它(这就是我所做的)。
  • compute-poly-tail 中调用递归时参数的顺序和值不正确,检查过程定义,确保以与定义它们相同的顺序传递值,也是对@987654325 的第一次调用@ 没有任何意义。
  • 你不应该将list命名为参数,这会与同名的内置过程冲突。我将其重命名为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

【讨论】:

  • 你好 oscar,如果我想使用第二个选项,在 (sub1 (length numlist)) 中开始 n 并在每次迭代时减少它,我是如何做到的。我很困惑。
  • @loren 我可以帮你,但这不是删除接受复选标记的理由,这很粗鲁。
  • 抱歉,Oscar 不会再这样做了。顺便说一句,你很有帮助。 :)
【解决方案2】:

建立功率系数和未知列表比使用地图功能。

; 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)))))


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2020-02-12
    • 2021-02-09
    相关资源
    最近更新 更多