2014-11-01 85 views
-1

我目前正在学习方案,并且遇到了一个难倒我的示例问题。 情况是,你有数字作为列表。数字2048是(8 4 0 2),399是(9 9 3)。 问题是要求比较这两个列表的相等性,在这种情况下list1> list2。在方案中比较两个数字列表的相等性

我迄今为止代码:

(define dl> 
    (lambda (d1 d2) 
    (if (> (length d2) (length d1)) 
     #f 
    ;then 
    (if (> (length d1) (length d2)) 
     #t 
    (let ((Rd1 (reverse d1)) (Rd2 (reverse d2))) 
    (let loop((ls1 Rd1) (ls2 Rd2)) 
     (cond 
     ((> (car ls1) (car ls2)) #t) 
     ((and (= (car ls1) (car ls2)) (not (null? (cdr ls2))) (not (null? (cdr ls1)))) (loop (cdr ls1) (cdr ls2))) 
     ((and (= (car ls1) (car ls2)) (null? (cdr ls2)) (null? (cdr ls1))) #f) ; dlnats are equal 
     (else #f)       
     ) 
    )) 
    )))) 

随着我的算法我试图开始检查,如果第二个名单是在长度(即更多的数字),那么这是不是比,因为它是不可能的,因此更大返回false。

然后它检查list1是否> list2。如果是这样,这是真的,因为list2不可能是> list1。

在这段代码中,我们可以假设它们是相同长度的列表。然后我倒过了名单。这样做是为了让最重要的位是第一位。然后循环遍历这两个列表,每次循环时都会添加检查。

如果LS1的元件> LS2那么它应该返回真

如果元素是相等的,二者的下一个值不为空,然后循环再次

如果元素相等和下一值都是null然后列表是相等的,它应该返回false

在这一点上,我真的不知道为什么代码不工作。它会工作,并提供正确的输出时,输入的字符串是不同的长度,但当他们在相同的长度我得到的错误:应用程序:

不是一个过程; 预期考虑到可以应用到参数的过程 :#T 参数...:[无]

只是想知道如果任何人能发现什么批判错的代码,我正在循环块,因为这似乎成为问题。提前致谢。

+0

的';那么'注释不应该有前面的左括号。 – uselpa 2014-11-01 15:40:55

+0

另外,取消注释'(else #f)'。 – uselpa 2014-11-01 15:41:54

+0

好的我已经完成了这个请检查编辑,因为我仍然得到相同的错误 – Ben 2014-11-01 15:48:38

回答

0

两个错误:

  1. ; then意见应该不会有前面的左括号
  2. 取消注释(else #f)

那么它应该工作。

无论如何我也会建议你简化你的代码如下:

(define (dl> d1 d2) 
    (let ((len1 (length d1)) (len2 (length d2))) ; determine lengths only once 
    (if (= len1 len2) 
     (let loop ((ls1 (reverse d1)) (ls2 (reverse d2))) 
      (if (null? ls1) ; or ls2, since they have the same length 
       #f 
       (let ((c1 (car ls1)) (c2 (car ls2))) 
       (if (= c1 c2) 
        (loop (cdr ls1) (cdr ls2)) 
        (> c1 c2))))) 
     (> len1 len2)))) 
0
(define (compare x y) 
    (if (null? x) 
    (if (null? y) 
     '= 
     '<) 
    (if (null? y) 
     '> 
     (let ((rest-comparison (compare (rest x) (rest y)))) 
     (case rest-comparison 
      ((=) (compare-number (first x) (first y))) 
      (else rest-comparison)))))) 

(define (compare-number x y) 
    (cond ((< x y) '<) 
     ((> x y) '>) 
     (else '=))) 
+1

如果他们提供一些解释而不仅仅是代码,答案总是更有帮助。 – 2015-10-21 15:35:41