我正在尝试编写一个带有两个列表(必须具有相同长度)的函数,然后通过每个列表比较各个项目。
例如:(1 2 3)
和(2 4 5)
将返回true,因为列表2的每个元素都大于列表1中的对应元素。(1 2 3)
和(0 4 1)
将返回{ {1}} false
和(1 2 3)
,因为它们的大小不同。使用Dr Racket
(1 2 3 4)
这不起作用。
答案 0 :(得分:1)
不幸的是,你的语法和逻辑都错了。我相信你的意图是写下这样的东西:
(define (each-bigger? lst1 lst2)
(cond
((and (null? lst1) (null? lst2)) #t) ; both lists are empty => true
((or (null? lst1) (null? lst2)) #f) ; only one is empty => not the same length => false
((>= (car lst1) (car lst2)) #f) ; first element of lst1 >= first element of lst2 => false
(else (each-bigger? (cdr lst1) (cdr lst2))))) ; recur on the rest of the list
可以缩短为
(define (each-bigger? lst1 lst2)
(or (and (null? lst1) (null? lst2)) ; EITHER both lists are empty
(and (not (or (null? lst1) (null? lst2))) ; OR 1) none of them is empty
(< (car lst1) (car lst2)) ; 2) AND first element of lst1 < first element of lst2
(each-bigger? (cdr lst1) (cdr lst2))))) ; 3) AND each-bigger? is true for the rest of both lists
希望这有帮助!
答案 1 :(得分:1)
显然,您希望从头开始实施解决方案,并且@ uselpa的建议是即时的。但是在非学术背景下,你应该使用现有的程序来解决这类问题,特别是andmap
是你最好的朋友:
(define (each-bigger? lst1 lst2)
(and (= (length lst1) (length lst2))
(andmap < lst1 lst2)))
诀窍是andmap
对两个列表的元素应用谓词,将lst1
的第一个元素和lst2
的第一个元素作为参数传递,然后是lst1
的第二个元素。 {1}}和lst2
的第二个元素,依此类推(BTW,andmap
接受一个或多个列表作为参数,只要谓词收到相同的数字参数)。
如果谓词的所有应用程序返回#t
然后返回#t
,则如果单个谓词返回#f
,则评估停止并返回#f
。在上面的示例中,谓词只是<
,在两个列表之间成对应用。它按预期工作:
(each-bigger? '(1 2 3) '(2 4 5))
=> #t
(each-bigger? '(1 2 3) '(0 4 1))
=> #f
(each-bigger? '(1 2 3) '(2 4 5 6))
=> #f