2012-10-06 53 views
1

我想要定義一個過程,該過程需要2個列表和一個非負整數的參數。假設有完美的輸入。我希望它在第一個列表中構建一個元素列表,直到它到達給定的整數元素,在這個元素處,我想用第二個列表中剩餘的元素完成它。讓我來證明一下。方案:在某個點結合列表

~(combine '(a b c d e) '(w x y z) 2) 
(a b y z) 

注意,第二個列表從下一指數繼續就好像被做CDR的全部時間。

這就是我所擁有的。這當然不起作用,我想我可能會使用錯誤的邏輯。

(define (combine seq1 seq2 point) 
(if (null? (or seq1 seq2)) 
    '() 
    (if (equal? point 0) 
     (cons seq2 '()) 
     (cons (car seq1) (combine (cdr seq1) (cdr seq2) (- point 1)))))) 

所有幫助將不勝感激!

謝謝!

回答

2

那麼,這條線不會做你想要什麼:

(if (null? (or seq1 seq2)) 

在流程中,空列表是真正值; 只有 Scheme中的虛假值爲#f。這意味着,

(or '() '(a)) 

回報'()

(or '(a) '()) 

回報'(一)

所以你對空檢查將返回#T只有一半的時間。 (如果'()是一個錯誤的值,因爲它是在正常的Lisp,那麼它會永遠不會工作,所以我不知道你在想什麼)。

如果您希望該行返回true,如果其中任何一個列表爲空,您將不得不重新考慮它。

然後是行

(cons seq2 '()) 

嘗試測試自身的該功能,看看會發生什麼 - 這不是你所需要的。如果你仔細想想,那條線應該會比較簡單。那時你真的需要返回什麼?

+0

好吧,我把它做的主要是我想要的!現在我得到一個類似於 ((a b)y z) 的列表如何組合這兩個列表?我只是使用append,但我的老師不會允許我。 – jblittle

+0

嗯。看起來好像你差不多在那裏,但是你也許會把其他東西搞砸。我很驚訝,因爲最後一行是完全正確的。如果你保留最後一行,我不會看到你如何得到新的結果,除非你在其他地方搞亂了seq1。 – itsbruce

+1

其實它確實發生了我seq1錯位的地方。我修復了它,現在代碼運行得很完美。萬分感謝! – jblittle