【问题标题】:How to check if the user doesn't put any thing in the list? Scheme Programming如何检查用户是否没有在列表中放置任何东西?方案编程
【发布时间】:2017-10-31 07:06:33
【问题描述】:
(define (min list)
 (cond ((empty? (car list) '"It is empty"))  <- Problem is here. Code work without this line.
       ((empty? (cdr list)) (car list))         ;to check list is empty
       ((< (car list) (min (cdr list))) (cdr list))
       (else (min (cdr list) ))))

我对方案编程语言非常陌生。我正在尝试从列表中获取最小值。当我输入 () 时,程序给了我一个错误:cdr: contract violation expected: pair?给定:'()。我在这里想要做的是我想打印出来当用户输入()时它是空的。在Scheme编程中可以这样做吗?

【问题讨论】:

  • 您要检查列表的第一个元素 (car) 是否为空?还是要检查列表是否为空?如果列表为空,则不能从列表中获取第一个元素。首先,您必须检查列表是否为空。如果不为空,则可以取第一个元素。示例:(if (pair? some-list) (car some-list))。如果某物是一对,则可以取第一个元素。否则不行。

标签: scheme racket


【解决方案1】:

您可以在How To Design Programs, 2e 中找到这个问题的答案——以及更多信息,这是一本由 Racket 语言的开发人员编写的教科书。

在这种情况下,您希望将模板用于列表中的函数。这在第 II 节,更具体的第 9.1 节中进行了介绍。

【讨论】:

    【解决方案2】:

    Scheme 和其他 Lisp 语言中的列表结构基于 cons-cells。每个 cons-cell 包含一个值(car)和指向列表中下一个 cons 单元(cdr,发音为 see-dar)的指针,如下所示:

             +-+-+                  
             |1|----+               
             +-+-+  |               
                    +-+-+           
                    |2|---+         
                    +-+-+ |         
                          +-+-+     
                          |3| |     
                          +-+-+
    

    列表结束的最后一个 cons-cell 包含一个 nil。在 Scheme 表示法中,cons-cell 如下所示:

    (1 . 2)
    

    所以一个没有任何语法糖的列表看起来像这样:

    (1 . (2 . (3 . (4 . nil))))
    

    一个空列表,由一个如下所示的 cons 单元组成:

    (nil)
    

    注意到空列表没有car?空列表被视为 nil,因此:

    (1 . (2 . (3 . (4 . ()))))
    

    和上一个一样工作。

    现在,当您使用语法糖时,列表如下所示:

    (1 2 3 4)
    

    但是底层结构是一样的。因此,要测试您是否有一个空列表,请测试它是否为 nil(Scheme 使用 empty? 函数执行此操作)。因此,不要在列表的汽车上调用empty?,这是错误的想法和错误,而是在列表中调用它。所以你的函数应该是这样的:

    (define (min list)
     (cond ((empty? list "It is empty"))
           ((empty? (cdr list)) (car list))
           ((< (car list) (min (cdr list))) (cdr list))
           (else (min (cdr list) ))))
    

    请注意,第二个臂检查列表是否为空,正如您的评论所说:它检查列表是否只有一个或没有元素。如果你的 cdr 是空的,但你的车不是(第二个手臂允许),那么你有一个元素列表:

    (foo . ())
    

    希望这会有所帮助!

    有关如何改进特定功能的更多信息,请查看Oscar Lopez's answer to this question

    【讨论】:

      【解决方案3】:

      我想你想打印空列表或获取最小值,对吧?

      (define (min list)
            (if (null? list)
                "It's empty."
                (let loop ([loop_list list]
                           [min_value (car list)])
                  (if (null? loop_list)
                      min_value
                      (loop
                       (cdr loop_list)
                       (if (< min_value (car loop_list)) min_value (car loop_list)))))))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-08
        • 2019-04-19
        • 2012-05-11
        相关资源
        最近更新 更多