(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:合同违规预期:对?给出:&#39;()。我想在这里做的是我想要打印出来当用户输入()时它是空的。是否有可能在Scheme编程中这样做?
答案 0 :(得分:0)
你可以在How To Design Programs, 2e这个由Racket语言开发者编写的教科书中找到这个问题的答案 - 以及更多 -
在这种情况下,您希望将模板用于列表上的功能。第II节更详细地介绍了这一点,更具体地说,第9.1节。
答案 1 :(得分:0)
Scheme和其他Lisp语言中列表的结构基于cons-cells。每个cons-cell都包含一个值(car
)和指向列表中下一个cons单元格的指针(cdr
,发音为see-dar),如下所示:
+-+-+
|1|----+
+-+-+ |
+-+-+
|2|---+
+-+-+ |
+-+-+
|3| |
+-+-+
列表结束的最后一个单元格包含一个零。在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。
答案 2 :(得分:0)
我想你要打印空列表或获取最小值,对吧?
(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)))))))