MITスキームを扱うプログラミングコースの模擬試験を受けています。質問の1つは尋ねます:
「リスト ls を返す手順 (インオーダー ls) を完了します。ただし、ls の前の値よりも厳密に大きくない最初の値の直前で停止することを除きます。つまり、インオーダーは、ls の次の部分を返す必要があります。厳密に昇順でソートされた先頭. ls には負でない整数のみが含まれていると仮定します."
次に、質問にいくつかの例を示します。
(in-order '(1 2 3 4)) ; should return (1 2 3 4)
(in-order '(1 2 3 3 4 5)) ; should return (1 2 3)
(in-order '(3 2)) ; should return (3)
(in-order '(3)) ; should return (3)
これは私の解決策です:
(define (in-order ls)
(cond ((null? ls) ls)
((< (car ls) (cadr ls))
(cons (car ls) (cons (in-order (cdr ls)) ())))
((>= (car ls) (cadr ls)) (car ls))
(else "Nothing")))
2 番目と 3 番目の例ではほとんど問題なく動作しますが、1 番目と 4 番目の例では完全に失敗します。引数の一部として null を渡そうとし続けることは知っていますが、これを回避する方法がわかりません。それ以外に、私が間違っていることは他にありますか?