2015-10-13 88 views
0

我是新來的計劃,我想知道如何清理我作爲一個任務寫的遞歸函數返回的值。該功能只需按照從最低到最高值的順序打印BST。我的問題有些迂腐,但我很好奇。函數的輸出是數字列表,但遞歸實現會在最後返回一個空列表。即8 16 20'()。有沒有一種簡單的方法來返回數字列表並省略空列表?我可以想象幾種做法;建立一個新的列表或字符串,並在最後返回它,但是它會爲這樣一個簡單的任務增加一些額外的開銷。有沒有更簡單的方法來達到這個結果?謝謝。返回類型在球拍計劃

注意:作業完成後,我應該在這一點上得到滿分,所以這不是一個家庭作業問題。

#lang racket 

(define (show lst) 

    (cond 
    [(null? (cadr lst)) 
    '()] 

    ; recur smaller tree 
    [(< (car lst) (caaddr lst)) 
    (show (cadr lst)) 
    ]) 

    ; print cur node 
    (writeln (car lst)) 

    (cond 
    [(null? (cadr lst)) 
    '()] 

    ; recur larger tree 
    [(show (caddr lst))]) 

) 

(show '(16 (8 (2()()) (10()())) (20 (18()()) (30()())))) 
+0

你的第二個'cond'很奇怪,它應該有一個'else'子句。偶然運作。 – uselpa

回答

1

您可以通過(void)在你的代碼替換'()因爲REPL將不打印此值。或者只是避免完全給出返回值:

(define (show lst) 
    (unless (null? (cadr lst)) 
    (when (< (car lst) (caaddr lst)) 
     (show (cadr lst)))) 
    (writeln (car lst)) 
    (unless (null? (cadr lst)) 
    (show (caddr lst)))) 
+0

(void)是完美的。我想到有這樣一個簡單的方法,但找不到它。直到現在,我還沒有遇到'除非',但是閱讀文檔似乎是簡寫,否則返回void,所以我想這只是同一個想法的一個更清晰的版本。謝謝您的幫助! –

+0

如果你沒有返回任何東西,你實際上隱含地返回'#'。因此,在我的例子中不返回任何東西可能會更容易,但顯式返回void也是如此。 – uselpa