2015-04-04 78 views
0

我是新來的計劃,所以我提前爲基本問題表示歉意。我試圖創建一個遞歸降序列表。目前它返回(1 2 3)而不是(3 2 1)計劃降序

我認爲問題是,我將我的新元素放在前面而不是列表的末尾。不過,我不太清楚如何獲取它,因爲我在嘗試時不斷收到錯誤。

這是我到目前爲止有:

所有的
(define (descend N mylist) 
    (if (= N 0) mylist 
     (descend (- N 1) (cons N mylist)))) 

(descend 3 '()) 

回答

0

首先,mylist說法是完全沒有必要。它絕不是空白列表,所以它可以簡單地省略。其次,如果你不需要你的函數是尾遞歸的,那麼只需將你的調用結構重新排序爲consdescend,這樣這個列表就是在相反的方向上構建的。

(define (descend N) 
    (if (= N 0) '() 
     (cons N (descend (- N 1))))) 

如果你需要一個尾遞歸版本,那麼它可能會更有意義,創建具有輔助迴路的蓄能器和簡單的迭代反向。

(define (descend N) 
    (let loop ((x 1) 
      (acc '())) 
    (if (= x N) (cons x acc) 
     (loop (+ x 1) (cons x acc))))) 
+0

感謝Alexis的幫助 - 我同意我喜歡你的第一個解決方案。它乾淨而簡單。但是,我確實需要讓我的功能成爲 - 「元素,列表」,並讓它成爲尾遞歸。這就是我擁有「mylist」的原因。你有什麼建議來滿足這個要求嗎? – user3281388 2015-04-04 19:38:17

+0

@ user3281388你能澄清第二個參數應該做什麼嗎?它總是被認爲是生成列表的尾部嗎? – 2015-04-04 19:39:07

+0

我理解它的方式是,列表將是最終返回的內容。我傳入一個int,然後返回一個降序列表。 – user3281388 2015-04-04 19:46:37