【问题标题】:Outputting a sorted list of pairs in scheme recursively (issue with base case)以递归方式输出方案中的排序对列表(基本情况问题)
【发布时间】:2016-04-04 20:03:11
【问题描述】:

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

苹果: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)

【问题讨论】:

  • 另外,我尝试了“map”并且有点成功,只是它最后返回了一堆“空洞”,这是我不想要的。
  • 另外,尽量不要像在(比如说)Java 中那样格式化代码。 Scheme/racket 有自己的格式约定,实际上看起来还不错。

标签: scheme racket


【解决方案1】:

您必须确保列表不为空,程序才能正常工作,这是基本情况。还要避免在每次迭代时对列表进行两次排序!试试这个:

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

【讨论】:

  • 非常感谢。这当然有效!我想知道为什么“(if(not(null?lst))”不起作用。在你回答之前我试图这样做,但它只返回了列表的第一项。
  • 在 Racket 中,if 必须有一个 else 部分,所以如果你没有放一个它就会失败。或者,您可以说(when (not ...)),但这相当于使用unless
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多