递归地输出方案中的排序对列表(基本情况问题)

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))