【问题标题】:How to implement this in Scheme如何在 Scheme 中实现这一点
【发布时间】:2019-06-01 21:35:06
【问题描述】:

我是 Scheme 的新手,但我在一项练习中遇到了一些问题。

这里是:编写 genlist 函数,以两个整数作为参数,并返回一个列表,其中包含两个提供的整数之间的集合

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

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

【问题讨论】:

    标签: scheme


    【解决方案1】:

    (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 知识通常无济于事。就像您假设由于意大利语和西班牙语是如此相似,斯洛文尼亚语也必须如此。

    【讨论】:

      【解决方案2】:

      您可以使用递归来做到这一点。

      (genlist x y) 的基本情况是x == y,在这种情况下产生(list x)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多