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

时间:2016-04-04 20:03:11

标签: scheme racket

我想排序并打印出类似这样的列表:

Apple:1 香蕉:2 ...等(每一对都在一个新的行上,但stackoverflow就像这样显示)

我发现我可以完成它,但是我得到一个错误,它期望一对,而它被给出一个空列表。我理解错误是因为我到达了列表的末尾,并且我需要一个基本案例,但我不确定需要什么。如果我检查列表是否为空,然后将列表作为我的基本案例返回,它就不会输出任何内容。

收到以下错误:

  

汽车:合同违规预期:对?给出:()

感谢您查看我的问题。

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

1 个答案:

答案 0 :(得分:2)

您必须确保列表不为空,以使该过程起作用,这是基本情况。还要避免在每次迭代时对列表进行两次排序!试试这个:

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