球拍:使用列表中的元素绘制抛物线

时间:2015-06-09 10:33:50

标签: list function plot racket

我创建了以下表达式,我想根据列表中的最后两个元素绘制抛物线图。它看起来像这样:

#lang racket
(require plot)

(define list-sqr-graph
  (lambda (lst)
    (cond
      [(null? lst) (plot (function sqr 0 0))]
      [(<= (car lst) 0) (list-sqr-graph (cdr lst))]
      [(not (equal? (length lst) 2)) (list-sqr-graph (cdr lst))]
      [else (plot (function sqr (car lst) (cdr lst)))])))

第一个条件语句检查列表是否为空,如果为true则返回空白图。第二个条件语句从列表中跳过小于或等于0的过去的数字。第三个条件语句检查列表的长度是否等于2,并在列表中向下,直到长度等于2。 else语句是我在运行表达式时遇到麻烦的地方,如:

(list-sqr-graph '(1 2 3))

这将导致错误读取:

function: contract violation
expected: (or/c rational? #f)
given: '(4)

从这个错误我开始相信列表的第一个元素被读作数字,但第二个元素有问题。这是为什么?

提前谢谢!

1 个答案:

答案 0 :(得分:3)

您在plot时传递列表。请记住cdr返回一个列表而不是一个元素(如car那样)。

您想使用cadr

#lang racket
(require plot)

(define list-sqr-graph
  (lambda (lst)
    (cond
      [(null? lst) (plot (function sqr 0 0))]
      [(<= (car lst) 0) (list-sqr-graph (cdr lst))]
      [(not (equal? (length lst) 2)) (list-sqr-graph (cdr lst))]
      [else (plot (function sqr (car lst) (cadr lst)))]))) <- HERE