我目前正在学习计划,而且我遇到了一个困扰我的例子问题。 情况是你有数字作为列表。数字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是否>列表2。如果是这样,那是因为list2不可能是> list1的。
在代码的这一点上,我们可以假设它们是相同长度的列表。然后我颠倒了这些清单。这样做是因为最重要的是第一位。然后循环遍历两个列表,每次循环时都会添加检查。
如果ls1中的元素> ls2那么它应该返回true
如果元素相等且两者的下一个值都不为null,则再次循环
如果元素相等且下一个值都为null,则列表相等,它应返回false
此时我真的不知道为什么代码不起作用。当输入的字符串长度不同时它会起作用并给出正确的输出但是当它们长度相等时我会得到错误:application:
不是程序; 期望一个可以应用于参数的过程 给出:#t 参数......:[无]
只是想知道是否有人能够发现任何严重错误的代码块,因为这似乎是问题所在。提前谢谢。
答案 0 :(得分:0)
两个错误:
; then
条评论不应有前面的左括号(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))))
答案 1 :(得分: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 '=)))