こんにちは、リストの長さが偶数かどうかをチェックするスキームの関数のコードを編集しました。
(define even-length?
(lambda (l)
(cond
((null? l)#f)
((equal? (remainder (length(l)) 2) 0) #t)
(else #f))))
それは正しいですか?
コードは明らかに間違っています%2
-Schemeがプレフィックス表記を使用する中置表記を想定しています。あなたの構文if
も間違っています- an のif
場合、 theelse
は暗黙的です(つまり、 がありますif condition true-expression false-expression
。この場合、あるレッグから #t を返そうとしていて、別のレッグから #f を返そうとしています-それはまったく不要です。できるでテストした式を返すだけですif
。
編集: もう 1 つの詳細 - 実際には、これを のような名前に変更する必要がありますeven-length?
。それが述語であると仮定したとしても、次のような名前は、それが戻る必要がeven
あることを暗示しますが、この場合、どちらもまったく機能しません。(even 3)
#f
(even 4)
#t
Edit2: mquander はすでに 1 つのバージョンのコードを提供しているので、もう 1 つ追加しても問題はないと思います。私はそれを次のように書きます:
(define (even-length? L) (even? (length L)))
小文字の 'l' (ただしそれ自体) をあまり使用したくないので、大文字にしました。が組み込まれているのでeven?
、残りを見つける代わりにそれを使用しました。
これを実行すると、次が生成されます。
> (even-length? `(1 2 3))
#f
> (even-length? `(1 2 3 4))
#t
>
これは、ある点であなたが持っていたものとは異なります: 空のリストの長さは 0 で、これは偶数と見なされます。
(偶数長? `())
#t を与える。
if
andの構文がcond
すべて混同されているようです。language referenceを参照することをお勧めします。 には 2 つの句しかなく、else 句についてはif
記述しません。(ヒント:この関数にはelse
はまったく必要ありません。)if
null
また、リストが次の場合に返すことが理にかなっているかどうかを検討してくださいnull
。#t
おそらく、または#f
代わりに戻りたいと思うでしょう。
そうそう、あなたの呼び出しを書き直してlength
、適切な接頭辞スタイルのScheme関数呼び出しにします。
(define even-length? (lambda (l)
(even? (length l))))
使用法:
(even-length? '(1 2 3 4))
#t
(even-length? '(1 2 3 ))
#f
他の人が指摘したように、数値の偶数性をチェックする述語が確かにあるので、それを使用しないのはなぜですか?
EDIT:Jerry Coffinが同じ関数を同じ例で書いているのを見たところです...繰り返してすみません:-)