2016-04-07 11 views
0

Sınıfta, kullanılmasına gerek duyulmadığında uzunluk fonksiyonunu kullanmama talimatı verdik. Bir listenin uzunluğunu sayan bir fonksiyonun nasıl yapıldığını biliyorum, fakat bir kondisyonda bir ölçüt olarak veya uzunluk kullanmadan uzunluğun nasıl konulacağını bilmek istiyorum.Uzunluk işlevini kullanmadan listenin uzunluğuyla ilgili koşul/koşul cümleciğinde nasıl bir koşul olabilir?

Ben:

(define (thing ls) 
    (if (> (length ls) 10) 
     'p 
     'q)) 

(define (thing2 ls) 
    (cond 
    [(> (add1 (thing2 (rest ls))) 10) 'p] 
    [else 'q])) 

alt biri bana verir: "gerisini: bekler boş olmayan bir liste; verilen: '()"

Bunu nasıl yapabilirim?

+0

. 'Thing2' 'şey' gibi çalışmanın bir yolu var mı yoksa mümkün değil mi? –

+1

Hiçbir zaman 'ls' değerlendirmeden önce boş olup olmadığını kontrol etmiyorsunuz (ls). (Bir listenin uzunluğuna bağlı olmak için "gerçek dünya" Şeması kodunda çok yaygın değildir. Genellikle kodunuzu, boyutundan ziyade bir listenin yapısı etrafında yazarsınız.) – molbdnilo

cevap

2

Bu sorunu, 'p numaralı yanıtı verebilmek için karşılaşmanız gereken minimum öğe sayısını parametre olarak ileterek bu sorunu çözebilirsiniz. İlk temel durum listeden çıkarmalıyız gitmek önler dikkat edin:

(define (thing ls n) 
    (cond [(empty? ls) 'q] 
     [(zero? n) 'p] 
     [else (thing (rest ls) (sub1 n))])) 

Sanki beklenen işleri: Sınıfta CDR için kazanılmış değil

(thing '(1 2 3 4 5 6 7 8 9 10) 10) 
=> 'q 
(thing '(1 2 3 4 5 6 7 8 9 10 11) 10) 
=> 'p