我正在嘗試反轉 Scheme 中的串列,但我只能使用define、car、cdr、list 嗎?,空?、if、cond、cons、display、begin和任何運算子。我不能使用追加、回圈(必須是純遞回)、lambda 和我沒有提到的任何其他函式。我也不允許使用輔助函式。一切都應該在一個功能中。
現在已經幾個小時了,我嘗試了多種解決方案,但我仍然無法解決這個問題。這是我得到的最接近的解決方案:
(define (my-reverse2 lis)
(if (null? (cdr lis)) lis
(cons (my-reverse2 (cdr lis)) (cons (car lis) '()))))
這是輸出:
> (my-reverse2 '(3 2 1))
Output: (list (list (list 1) 2) 3)
輸出應該類似于(1 2 3). 我應該如何進行?
uj5u.com熱心網友回復:
是否允許使用可選引數?
(define (my-reverse lst [lst2 '()])
(if (null? lst) lst2
(my-reverse (cdr lst)
(cons (car lst) lst2))))
測驗:
> (my-reverse '(3 2 1))
'(1 2 3)
uj5u.com熱心網友回復:
最簡單的方法是使用累加器值:
(define (my-reverse the-list acc)
(if (null? the-list)
acc
(my-reverse (cdr the-list)
(cons (car the-list) acc))))
你叫這個(my-reverse '(1 2 3) '())。如果 Scheme 中有可選引數,您可以acc使用空串列的默認值來設定可選引數。在我的代碼中,我通常會使用一個僅包含一個引數的包裝器,然后使用空串列呼叫兩個引數版本。
uj5u.com熱心網友回復:
首先,反轉cdr并取它的car——這將是……最后一個元素,對吧?--cdr它將是反向核心,即沒有最后一個和第一個元素的原始串列。
然后,cons將原始元素car放到反轉的核心上,reversed,從而按原始順序獲取串列中沒有最后一個元素的所有元素。那么現在我們可以反轉它,并將cons最后一個元素放到結果中。
很簡單,對吧?是的,沒有那么多。所以這里有一個例子:
a b c ...... m n ; car, cdr:
b c ...... m n ; reversen-1:
| n m ...... c b ; car, cdr:
| m ...... c b ; reversen-2:
| | b c ...... m ; cons a:
a | b c ...... m ; reversen-1:
| m ...... c b a ; cons n:
n m ...... c b a ; =: reversen
所有這些需要是cdr, car, cons, null?, cond, 和遞回。 let/define會有很大幫助,但不是絕對必要的。不要忘記照顧角落案例。
另請參閱:我的這個相關答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455066.html
下一篇:滿足條件時如何退出遞回?
