Racket:用列表中的元素绘制抛物线
Racket: Graphing a parabola with elements from a list
我创建了以下表达式,我想根据列表中的最后两个元素绘制抛物线图。它看起来像这样:
#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)))])))
第一个条件语句检查列表是否为空,returns如果为真则检查空白图。第二个条件语句跳过列表中小于或等于 0 的数字。第三个条件语句检查列表的长度是否等于 2,并沿着列表向下直到长度等于 2。
当 运行 表达式如:
时,else 语句是我遇到麻烦的地方
(list-sqr-graph '(1 2 3))
这将导致读取错误:
function: contract violation
expected: (or/c rational? #f)
given: '(4)
从这个错误中,我认为列表的第一个元素被读取为数字,但第二个元素有问题。这是为什么?
提前致谢!
您在 plot
ing 时正在传递列表。记住 cdr
returns 是一个列表而不是一个元素(就像 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
我创建了以下表达式,我想根据列表中的最后两个元素绘制抛物线图。它看起来像这样:
#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)))])))
第一个条件语句检查列表是否为空,returns如果为真则检查空白图。第二个条件语句跳过列表中小于或等于 0 的数字。第三个条件语句检查列表的长度是否等于 2,并沿着列表向下直到长度等于 2。 当 运行 表达式如:
时,else 语句是我遇到麻烦的地方(list-sqr-graph '(1 2 3))
这将导致读取错误:
function: contract violation
expected: (or/c rational? #f)
given: '(4)
从这个错误中,我认为列表的第一个元素被读取为数字,但第二个元素有问题。这是为什么?
提前致谢!
您在 plot
ing 时正在传递列表。记住 cdr
returns 是一个列表而不是一个元素(就像 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