我被分配在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)) '()))))))
答案 0 :(得分:2)
一个简单的错误?他可能会提到#1,但即使在修复之后你还有一些标识符和括号要修复:
lambda
,null?
,length
,append
和reverse
拼写错误。 letrec
结果因为你周围有多余的括号而被应用。cond
在merge
中您比较的元素缺少括号两个位置。
醇>
很明显你需要有关括号匹配的帮助,所以你应该下载一个体面的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)
能够返回位置ls
中pos
的元素:
(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))))