2014-02-10 35 views
1

我想弄清楚如何在Scheme中使用遞歸來完成相反順序(回到前面)的列表。我的研究表明,您可以在列表中使用反向函數,但我不想走這條路線。向後通過方案中的列表

我知道以下內容返回列表中的最後一個元素;

(caddr '(1 5 3)) 
returns 3 

我希望能夠通過功能剩下的1 5發回,看看最後一個元素再次重複,直到列表耗盡

從左至右是很簡單的,你看看列表中的汽車併發回cdr。

+0

在基礎步驟,遞歸步驟以及它們進入的順序中分解問題。提示:如果您首先執行遞歸步驟,然後執行基礎操作,則會遞歸遍歷整個列表,然後處理基礎案例,然後在堆棧展開時執行剩餘的元素。 – yan

+0

函數'caddr'不返回'列表'中的最後一個元素;它返回'你的列表'中的最後一個元素。 – GoZoner

+0

「reverse」有什麼問題? – ceving

回答

2

先遞歸調用,然後處理car。例如:

(define (process-in-reverse lst fun) 
    (when (not (null? lst)) 
    (process-in-reverse (cdr lst) fun) 
    (fun (car lst)))) 

然後

> (process-in-reverse '(1 5 3) display) 
351 

如果你只是想扭轉結果如果後續調用都獨立於以前的話費,蓄能器會做,是尾遞歸:

(define (process-reverse-result lst fun) 
    (let loop ((lst lst) (res null)) 
    (if (null? lst) 
     res 
     (loop (cdr lst) 
       (cons (fun (car lst)) res))))) 

then

> (process-reverse-result '(1 5 3) add1) 
'(4 6 2) 
+0

在[tag:scheme]中的ppl應該真的讓對方更滿意。如果不是我們,那麼誰呢?這是一個很好的答案,爲什麼直到現在它才被提升? –