我对绘制图像的递归函数有疑问
是的,这是一个家庭作业,但我不知道如何绘制该图像。到目前为止我所拥有的是:
(list (x1/y2) (x2/y2)...(xn/yn)
)point-x (first lis)
(zipWith f xs ys)
的函数,它带有两个列表(xs ys)
应用函数f
并创建一个列表(例如(zipWith + (list 1 2 3) (list 10 20 30)) -> (list 11 22 33)
)make-tuple
,它接受两个列表并使它们成为元组(例如:(make-tuple (list 1 2 3) (list 4 5 6)) -> (tuple (list 1 2 3) (list 4 5 6))
(xs1 (tuple (list 1 2 3) (list 4 5 6)) -> (list 1 2 3)
现在到实际功能:
我们必须使用函数add-line
,它从一个点到另一个点画一条线
参数为image number number number number string
换句话说:empty-image x1 y1 x2 y2 "black"
因此,它以empty-image
开头,并使用颜色(x1/y1)
(x2/y2)
到"black"
绘制一条线
我们必须使用fold
来编写函数。所以我尝试了这个:
;Signature
(: render ((list-of point) -> image))
(define render
(lambda (xs)
(let((tuple-list (zipWith make-tuple xs (rest xs))))
(fold empty-image
add-line
tuple-list))))
我尝试做的是获取积分列表,并制作一个包含积分元组的列表
(list (tuple (x1/y1) (x2/y2)) (tuple (x2/y2) (x3/y3))...(tuple (xn/yn) (xn/yn)))
现在,我想将add-line
与fold
一起应用于元组列表。所以我说,让我们取第一个元组(我的两个点)并将它们应用于函数add-line
。然后使用下一个元组并将这些点应用于add-line
函数(依此类推),直到我的列表为空。
现在的问题是,Scheme说 add-line
需要6个参数,但只找到2个。我知道我的问题,因为add-line
不知道从哪里获取其他参数。所以我试过了:
(define render
(lambda (xs)
(let((tuple-list (zipWith make-tuple xs (rest xs))))
(fold empty-image (add-line
empty-image
(point-x (xs1 (first tuple-list)))
(point-y (xs1 (first tuple-list)))
(point-x (xs2 (first tuple-list)))
(point-y (xs2 (first tuple-list)))
"black")
tuple-list))))
并知道它说“函数调用:预期在打开括号后的函数,但收到图像”
我再次知道我的错误,add-line
绘制了一行,折叠尝试将该图像应用到列表中,但需要一个函数而不是一个图像。所以我的问题是:
如何用render
和add-line
编写递归函数fold
,绘制第一行,然后得到下一个点并绘制下一行与第一行相结合?
(就像一个递归的add-line
函数,在绘制一条线后再次调用自己)
答案 0 :(得分:1)
您没有具体说明您使用的语言, 但这看起来很可疑:
(fold empty-image (add-line ...))
在Racket中,使用fold
的方式是:
(foldl f base l)
这里f
是一个函数。在您的代码中,您有empty-image
。
你需要定义一个函数说f
,它使用一个元组在“当前”图像上添加一行:
; f : tuple image -> image
(define (f t img)
(add-line img
(point-x (xs1 t))
(point-y (xs1 t))
(point-x (xs2 t))
(point-y (xs2 t))
"black"))
然后
(foldl f empty-image tuple-list)
您可能需要调整一两件事才能让它发挥作用。