递归地输出方案中的排序对列表(基本情况问题)
Outputting a sorted list of pairs in scheme recursively (issue with base case)
我想像这样排序并打印出一个列表:
苹果:1
香蕉:2
...等等(每一对都在一个新行上,但 Whosebug 是这样显示的)
我发现我基本上可以完成它,但是我得到一个错误,它需要一对,而它给出的是一个空列表。我知道这个错误是因为我到达了列表的末尾,我需要一个基本案例,但我不确定需要什么。如果我检查列表是否为空,然后 return 列表作为我的基本情况,它不会输出任何内容。
出现以下错误:
car: contract violation expected: pair? given: ()
感谢您检查我的问题。
(define lst '( ("Apple" 1) ("Orange" 4) ("Pear"3) ("Banana" 2)) )
(define name (lambda (m)
(car m)
))
(define priority (lambda (m)
(car (cdr m))
))
(define sortList
(lambda (lst)
(sort lst
(lambda (x y)
(<(priority x)(priority y))
)
)
)
)
(define printItem (lambda (m)
(display (name m))
(display " : ")
(display (priority m))
(display "\n")
)
)
(define printQueue
(lambda (lst)
(printItem (car(sortList lst)))
(printQueue (cdr (sortList lst)))
)
)
(printQueue lst)
您必须确保列表不为空,程序才能正常工作,这是基本情况。还要避免在每次迭代时将列表排序 两次 !试试这个:
(define printQueue
(lambda (lst)
(unless (null? lst)
(printItem (car lst))
(printQueue (cdr lst)))))
(printQueue (sortList lst))
顺便说一句,在这种情况下使用 for-each
会更加地道:
(define (printQueue lst)
(for-each printItem lst))
我想像这样排序并打印出一个列表:
苹果:1 香蕉:2 ...等等(每一对都在一个新行上,但 Whosebug 是这样显示的)
我发现我基本上可以完成它,但是我得到一个错误,它需要一对,而它给出的是一个空列表。我知道这个错误是因为我到达了列表的末尾,我需要一个基本案例,但我不确定需要什么。如果我检查列表是否为空,然后 return 列表作为我的基本情况,它不会输出任何内容。
出现以下错误:
car: contract violation expected: pair? given: ()
感谢您检查我的问题。
(define lst '( ("Apple" 1) ("Orange" 4) ("Pear"3) ("Banana" 2)) )
(define name (lambda (m)
(car m)
))
(define priority (lambda (m)
(car (cdr m))
))
(define sortList
(lambda (lst)
(sort lst
(lambda (x y)
(<(priority x)(priority y))
)
)
)
)
(define printItem (lambda (m)
(display (name m))
(display " : ")
(display (priority m))
(display "\n")
)
)
(define printQueue
(lambda (lst)
(printItem (car(sortList lst)))
(printQueue (cdr (sortList lst)))
)
)
(printQueue lst)
您必须确保列表不为空,程序才能正常工作,这是基本情况。还要避免在每次迭代时将列表排序 两次 !试试这个:
(define printQueue
(lambda (lst)
(unless (null? lst)
(printItem (car lst))
(printQueue (cdr lst)))))
(printQueue (sortList lst))
顺便说一句,在这种情况下使用 for-each
会更加地道:
(define (printQueue lst)
(for-each printItem lst))