2015-10-29 3 views
0

У меня есть следующий код:Схема - Подсчет элементов в списке

(define (howMany list) 
    (if (null? list) 
     0 
     (+ 1 (howMany (cdr list))))) 

если сделать следующее: (howMany '(1 2 3 (4 5))) мы получим 4, как результат. Как сделать так, чтобы он подсчитывал число целых чисел в моем списке. Значение той же проблема будет возвращать 5 в качестве ответа, вместо 4.

ответ

3

Вы просто должны использовать стандартный шаблон для обхода списка списков:

(define (howMany lst) 
    (cond ((null? lst) 0)     ; an empty list has 0 elements 
     ((not (pair? lst)) 1)   ; if it's an element, then count it as 1 
     (else (+ (howMany (car lst))  ; otherwise advance the recursion 
       (howMany (cdr lst)))))) ; over both the `car` and the `cdr` 

Более короткое и более идиоматическое решением будет использовать встроенное -в процедуры список, как это:

(define (howMany lst) 
    (length (flatten lst))) 

в любом случае, это работает, как ожидалось:

(howMany '(1 2 3 (4 5))) 
=> 5 
+0

это doabl e без встроенных функций, таких как пара, а не? – user3610137

+1

Нет, как еще вы можете сказать, нашли ли мы элемент? 'pair?' и 'not' являются двумя примитивными стандартными функциями, нет ничего необычного в их использовании! Если мы переупорядочиваем условия, мы можем исключить 'not', но вам понадобится' pair? 'Или' list? 'В какой-то момент –

+0

как вы можете сделать это со списком? вместо пары? – user3610137

Смежные вопросы