方案和合并排序?

时间:2013-12-10 22:27:13

标签: scheme mergesort

我被分配在Scheme中编写合并排序,但我遇到了一些问题。我把它展示给了我的教授,他说有一个简单的错误。有人能帮我吗? Plzz!

(define msort
     (lamdba(1st)
          (cond
               ((null?? 1st) 1st)
               ((null? (cdr 1st)) 1st)
               (#t ((letrec ((half (quotient (lenght 1st) 2))
                    (merge (lamdba (a b result)
                         (cond ((null? a) (apped (reserve a) result))
                               ((null? b) (append (reserve a) result))
                               ((> (car a) (car b) (merge a (cdr b) (cons (car b) result))
                               (#t (merge (cdr a) b (cons (car a) result)))))))
                   (merge (msort (take 1st half)) (msort (drop 1st half)) '()))))))  

2 个答案:

答案 0 :(得分:2)

一个简单的错误?他可能会提到#1,但即使在修复之后你还有一些标识符和括号要修复:

  1. lambdanull?lengthappendreverse拼写错误。
  2. letrec结果因为你周围有多余的括号而被应用。
  3. {li> condmerge中您比较的元素缺少括号两个位置。

    很明显你需要有关括号匹配的帮助,所以你应该下载一个体面的IDE来编写代码。我使用DrRacket进行Scheme开发(#!R5RS,#!R6RS和#!racket)并且它是idents(只需按 CTRL + i 以在粘贴代码后重新获得它)并指示当你点击 RUN 时函数名称被写错了。

    在开始时使合并成为一个全局函数,并且可能稍后将其移动到letrec(如果必须)可能会简化开发。例如。您可以通过测试(merge '(3 2 1) '())等内容来查找错误。

    这不能保证程序能够正常工作,因为我只在这里解决语法问题。你需要调试它! DrRacket 也有调试器!

答案 1 :(得分:0)

我认为首先实现一个允许合并两个有序列表的函数是有用的:

(define (merge l1 l2)
  (if (empty? l1)
      l2
      (if (empty? l2)
          l1
          (if (< (car l1) (car l2))
              (cons (car l1) (merge (cdr l1) l2))
              (cons (car l2) (merge l1 (cdr l2)))))))

现在假设我们有一个函数(get ls pos)能够返回位置lspos的元素:

(define (get ls pos)
  (if (= pos 1)
      (car ls)
      (get (cdr ls) (- pos 1))))

最后,我们可以实现mergesort功能:

(define (mergesort l p r)
  (if (= p r)
      (cons (get l p) empty)
      (merge (mergesort l p (floor (/ (+ p r) 2))) (mergesort l (+ (floor (/ (+ p r) 2)) 1) r))))