【发布时间】:2019-06-01 21:35:06
【问题描述】:
我是 Scheme 的新手,但我在一项练习中遇到了一些问题。
这里是:编写 genlist 函数,以两个整数作为参数,并返回一个列表,其中包含两个提供的整数之间的集合
例如:(genlist 5 12) => (5 6 7 8 9 10 11 12)
我已经在 Python 中做过,但我不知道如何在 Scheme 中实现。
【问题讨论】:
标签: scheme
我是 Scheme 的新手,但我在一项练习中遇到了一些问题。
这里是:编写 genlist 函数,以两个整数作为参数,并返回一个列表,其中包含两个提供的整数之间的集合
例如:(genlist 5 12) => (5 6 7 8 9 10 11 12)
我已经在 Python 中做过,但我不知道如何在 Scheme 中实现。
【问题讨论】:
标签: scheme
(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 有 cons 单元格。学习第一门 lisp 语言时,Algol 知识通常无济于事。就像您假设由于意大利语和西班牙语是如此相似,斯洛文尼亚语也必须如此。
【讨论】:
您可以使用递归来做到这一点。
(genlist x y) 的基本情况是x == y,在这种情况下产生(list x)
递归停止将从(genlist x y) 到(genlist (+ x 1) y)
【讨论】: