2017-02-07 83 views
1

我正在做一些球拍練習,其中一個練習要求創建一個名爲「count-trees」的函數,它將計算ListTree中的所有元素。中的說明,一個ListTree是具有以下定義(一個或多個)的遞歸數據結構:如何計算球拍中列表樹中的元素數量?

- 它可以是一個整數

- 它可以是一個列表或子列表的列表

-per說明,我們假定一個清單樹不能爲空

這裏有一個什麼樣的名單樹看起來像一個例子:

(list 1 2) 

(list (list 1) 
     2 
     (list 1 4 5)) 

(list 1 
     (list 2 1) 
     1 
     1) 

現在,這裏是WH在我的代碼如下所示:

(define count-tree (lambda (lst) 
        (if (empty? lst) 
         0 
         (length (lst))))) 

當我執行的功能,它的工作原理,但只有當有一個列表,而不是在包含子列表清單。它似乎只計算有多少個列表,但我希望它列出列表中的所有元素。有沒有辦法去解決這個問題?謝謝!

回答

1

長度可以實現這樣的:

(define length 
    (lambda (lst) 
    (if (empty? lst) 
     0 
     (+ 1 (length (cdr lst)))))) 

而且這樣的:

(length '((1 2) (3 4))) 
; ==> 2 

由於列表中有兩個元素。它並不妨礙這兩個元素是兩個也包含元素並且你的函數需要這樣做的列表。因此你的功能需要做一件比length更多的事情。您需要對carcdr的遞歸進行求和,以便在car中有一對,否則與length相同。

還有更多巧妙版本的length,但我想你會在稍後瞭解到。