2013-10-17 52 views
0

我在方案中寫了90%的樹圖函數,但是我遇到了一個很麻煩的問題。當我用二叉樹測試我的代碼時,除了第一個節點之外的所有節點都被正確映射。第一個節點退出了,我似乎無法想到解決這個問題的方法。任何建議在這裏將不勝感激。方案中的樹圖函數

(define (value tree) 
(car tree)) 

(define (left tree) 
    (car (cdr tree))) 

(define (right tree) 
(car (cdr (cdr tree)))) 

(define (tree-map f T) 
(cond ((null? T) '()) 
    ((and (null? (right T))(null? (left T))) '())                
    ((and (null? (right T))(not (null? (left T)))) 
        (make-tree (f (value(left T))) 
           (tree-map f (left T)) 
           (right T))) 
    ((and (null? (left T))(not (null? (right T)))) 
        (make-tree (f (value(right T))) 
           (left T) 
           (tree-map f (right T)) 
           )))) 

回答

2

此代碼真的令人費解。首先,我沒有看到一個else語句,以及一個非常大的案例(如果兩個分支都不是空的話)。其次,爲什麼當你有空樹的情況下,你的左邊或右邊是否爲空?

(define (tree-map f T) 
(cond ((null? T) '()) 
     (else (make-tree (f (value T)) 
         (tree-map f (left T)) 
         (tree-map f (right T)))))) 

作爲一個人類編譯器並不好玩。所有你不知道的事情是,葉,空左和空右的情況下重寫相同的代碼,但是在適當的地方手動放入'(),而不是依靠函數來爲你做。

+0

有時我們覺得太辛苦了,不是嗎? –

1

看來,有幾個錯誤:

  • 如果發現葉節點,你是不是應用功能節點
  • 的情況下一個節點都具有子樹缺少
  • 其中施加功能的部分是錯誤的

用,問題你的樣品之一試試這個不包括所有必要的代碼來測試它自己:

(define (tree-map f T) 
     ; empty tree 
    (cond ((null? T) 
     '()) 
     ; leaf node 
     ((and (null? (right T)) (null? (left T))) 
     (make-tree (f (value T)) '() '())) 
     ; empty right subtree 
     ((and (null? (right T)) (not (null? (left T)))) 
     (make-tree (f (value T)) 
        (tree-map f (left T)) 
        '())) 
     ; empty left subtree 
     ((and (null? (left T)) (not (null? (right T)))) 
     (make-tree (f (value T)) 
        '() 
        (tree-map f (right T)))) 
     ; both subtrees are present 
     (else 
     (make-tree (f (value T)) 
        (tree-map f (left T)) 
        (tree-map f (right T)))))) 
+0

成功!順便說一下,我沒有提供創建樹的功能的原因是它有點長。如果你認爲我應該把它添加到這篇文章,讓我知道。 –