比较DrRacket中两个相同长度列表的各个元素

时间:2014-02-23 15:41:32

标签: list scheme racket

我正在尝试编写一个带有两个列表(必须具有相同长度)的函数,然后通过每个列表比较各个项目。

例如:(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)

这不起作用。

2 个答案:

答案 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