Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Определить количество элементов, которые не делятся на 2
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Satirikon Satirikon вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.04.2009
По умолчанию Определить количество элементов, которые не делятся на 2 - 01.05.2009, 14:46

Помогите пожалуйста решить вот такую задачу: Дан список целых чисел. Определить количество элементов, которые не делятся на 2.
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 01.05.2009, 16:02

Код:
CL-USER> (count-if #'oddp '(1 2 3 4 5 6 7))
4
Ответить с цитированием
  (#3 (permalink)) Старый
Satirikon Satirikon вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.04.2009
По умолчанию 01.05.2009, 16:57

Спасибо! а можно это как-нибудь реализовать в AutoLISP? с помощью своей функции...
Ответить с цитированием
  (#4 (permalink)) Старый
Satirikon Satirikon вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.04.2009
По умолчанию 15.05.2009, 23:44

помогите найти и исправить ошибку, уже почти докопался до истины, но не могу понять в чём дело (в данном случае должно подсчитываться количество чётных элементов):

Код:
(setq n 0)
(defun f(list)
    (if (= (rem (car list) 2) 0); если остаток от деления головы списка на 2 равен 0
     (progn; true-> выполняются следующие действия
       (setq  n (+ n 1)); задаём n = n+1... (счётчик)
       (f (cdr list))); ... и рекурсивно просматриваем хвост списка (все остальные элементы, кроме головы)
         (f (cdr list))); false-> просматриваем все остальные элементы списка
  )
пожалуйста, помогите чайнику, скажите что здесь не так, а то я пока что-то не врубаюсь.

вот что выдаёт при вводе

Код:
_$ (setq n 0)
0
_$ (setq l '(1 2 3 4 5))
(1 2 3 4 5)
_$ (f l)
; error: bad argument type: numberp: nil          <-- хуле??))
Ответить с цитированием
  (#5 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 16.05.2009, 01:55

Как Вами верно применено, рекурсия является естественным образом мышления (и действий) при решении <в том числе> подобных задач.
Один из принципов правильного применения рекурсии - приведение к более простому состоянию.
В нашем случае для укороченного списка проще посчитать число определенных элементов.
Другой же принцип применения рекурсии - это представление о том, что результат для "более простого" состояния УЖЕ ГОТОВ (возвращен со более глубокого уровня), и на данном уровне рекурсии следует <всего лишь> определить, каким образом вернуть правильный результат для ДАННОГО уровня.
В нашем случае к результату для "более простого" состояния следует прибавить 1 (или не прибавлять) в зависимости от четности элемента.
Наконец, есть принцип терминального состояния (то есть такого, которое «проще некуда») - следует определить, какой результат возвращается из этого состояния.
В нашем случае терминальное состояние - пустой список, а так как в пустом списке четных элементов нет, то вызов функции для пустого списка должен возвращать 0(ноль).
Код:
(defun F (L)
  (cond
   ((null L) 0)
   ((zerop (rem (car L) 2)) (1+ (F (cdr L))))
   (T (F (cdr L)))))
P.S. Зачем сквернословить?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Satirikon Satirikon вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.04.2009
По умолчанию 16.05.2009, 02:12

Огромнейшее спасибо за объяснения! Вы мне очень помогли! Благодарю! Теперь с рекурсией многое стало понятно.
За сквернословие извиняюсь - просто писал в очень эмоциональном состоянии
Ответить с цитированием
  (#7 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 16.05.2009, 02:29

От крепких выражений AutoCAD может «зависать»!
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти количество слов,которые содержат ровно 3 буквы А AlCore Python 1 09.01.2011 13:18
Определить рекурсивную функцию, возвращающую количество элементов kaizer131 Lisp 3 15.09.2010 00:39
Определить рекурсивную функцию, возвращающую количество определенных элементов в спис metge Lisp 1 27.10.2009 18:55
Подсчитать количество элементов матриц A1co1ine Вопросы начинающих программистов 1 02.04.2009 12:10
Почему количество элементов становиться равным Insomnia Вопросы начинающих программистов 29 28.10.2008 22:22
Как определить количество элементов в ListView HILFE sommer .NET 1 07.05.2008 14:30
Максимальное количество элементов в CListCtrl AKyJIA Visual C++ 4 21.11.2005 14:28
Поиск выражения и количество найденных элементов rdt2005 Visual Basic 1 04.08.2005 17:11
Как посчитать количество элементов в массиве структур atomsk С/С++ 5 14.06.2005 04:35
Как подсчитать количество уникальных элементов в списке Ксения Prolog 5 25.10.2004 19:18
Как определить файлы которые заняты системой Doglike76 Visual C++ 0 29.08.2004 00:56
Количество отображаемых элементов в CComboBox Anonymous Visual C++ 1 19.04.2003 00:28



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов