8

リストの最後の要素を返す単純なスキーム関数を作成しようとしています。私の機能はうまくいくように見えますが、何かで失敗しました:

(define (last_element l)(
  (cond (null? (cdr l)) (car l))
  (last_element (cdr l))
))

(last_element '(1 2 3)) should return 3

DrRacket は私にエラーを与え続けます:

mcdr: contract violation
  expected: mpair?
  given: ()

本当なので(null? '())、なぜこれが機能しないのかわかりません。

これは宿題に必要だと思う関数です(関数を書くことlast-elementは課題ではありません)、説明書には組み込み関数を使用できないと書かれているreverseので、(car (reverse l))

この機能を修正するにはどうすればよいですか?

4

4 に答える 4

13

あなたの構文は完全に間違っています。関数の本体の周りに余分な括弧のセットがあり、句の周りに十分でcondはなく、再帰的なケースが 内にさえないcondため、テストが成功するか失敗するかに関係なく実行されます。次の手順が機能するはずです。

(define (last_element l)
  (cond ((null? (cdr l)) (car l))
        (else (last_element (cdr l)))))
于 2012-11-01T10:40:08.900 に答える
7

追加するだけです。プロレベルのラケットでは、最後の関数はラケット/リストライブラリの一部です。

于 2012-11-01T23:00:35.887 に答える