2013-12-10 100 views
-2

我被分配在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

嘿約瑟夫,你是否改變了我的代碼?你能解釋你做了什麼嗎?我感謝您的幫助! – user3088420

+1

它被認爲是不好的做法,以解決問題中的代碼,所以@jozefg可能只是格式化代碼,以便人類可讀。 – Sylwester

+0

@Sylwester事實上,這有點不文明。對於OP:在每行上的代碼之前添加4個空格使您能夠語法高亮顯示+縮進 – jozefg

回答

2

一個簡單的錯誤?他大概提到#1,但即使固定你有一些標識符和括號修復後:

  1. lambdanull?lengthappendreverse拼寫錯誤。
  2. letrec結果得到應用,因​​爲你有多餘的括號。
  3. cond in merge在哪裏比較元素缺少括號兩個地方。

很明顯,你需要用括號匹配的幫助,所以你應該下載一個體面的IDE中寫代碼。我用DrRacket的方案開發(#!R5RS,#!R6RS和#!球拍),它idents(只請按CTRL + i以在粘貼代碼後將其重新輸入),並指示當您按下RUN時,函數名寫入錯誤的位置。

在開始時進行全局函數合併,稍後可能將其移至letrec(如果必須的話)可能會緩解開發。例如。你可以通過測試像(merge '(3 2 1) '())這樣的東西來發現錯誤。

這不能保證程序能夠正常工作,因爲我只在這裏解決語法問題。你需要調試它! DrRacket也有調試器!

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)能夠在pos位置返回的ls元素:

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