如何在Scheme中实施

时间:2019-06-01 21:35:07

标签: scheme

嗨,我是Scheme的新手,一次练习有些问题。

在这里:编写genlist函数,以两个整数作为参数并返回一个列表,该列表包含所提供的两个整数之间的整数集。

例如:(genlist 5 12)=>(5 6 7 8 9 10 11 12)

我已经在Python中做到了,但是我不知道如何在Scheme中实现。

2 个答案:

答案 0 :(得分:0)

您可以使用递归来实现。

(genlist x y)的基本情况是x = y时,则产生(list x)

递归停止将从(genlist x y)到(genlist(+ x 1)y)

答案 1 :(得分:0)

(5 6 7)这样的列表是由(cons 5 (cons 6 (cons 7 '())))组成的,因此最简单的解决方案是:

(genlist 8 7) ; ==> ()
(genlist 7 7) ; ==> (cons 7 (genlist 8 7))

现在,这不是最好的方法,只是最简单的方法。最好的方法是使用助手从头到尾创建列表:

(genlist-helper 6 7 '())                  ; ==>
(genlist-helper 6 6 (cons 7 '()))         ; ==>
(genlist-helper 6 5 (cons 6 (cons 7 '())) ; ==>
(cons 6 (cons 7 '())

现在genlist仅通过提供空列表作为初始累加器来调用帮助程序。也可以使用本地过程来执行此操作,在该过程中,您不需要添加第一个参数,因为它具有词法闭包,甚至可以通过使用命名为let来简化它。

我不知道您是如何在Python中完成的。我不记得python有缺点细胞。学习第一门口语时,Algol知识通常无济于事。就像您做出这样的假设:既然意大利语和西班牙语是如此相似,那么斯洛文尼亚语也必须如此。