25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
1

Каждый нечетный элемент списка умножить на 2, каждый четный на 3

05.02.2014, 11:55. Показов 2478. Ответов 8
Метки нет (Все метки)

сначало пытаюсь написать хотя бы проверку на четность и умножение на 3.

Lisp
1
2
3
4
5
(defun четность (l)
 (cond((null l)nil)
  (t(if(= (mod (car l) 2) 0) (если число делится на 2 без остатка)
   (* (car l) 3))) (то умножить его на 3)
    (четность (cdr l))))
в итоге

Lisp
1
2
(четность `(1 2 3))
NIL
Lisp
1
2
3
4
5
6
(trace четонсть)
(четность `(1 2 3))
 
1> (четность (1 2 3))
<1 (четность NIL)
NIL
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2014, 11:55
Ответы с готовыми решениями:

каждый нечетный элемент списка умножить на 2, каждый четный на 3. использовать только рекурсию CAR,CDR,COND,CONS
каждый нечетный элемент списка умножить на 2, каждый четный на 3. использовать только рекурсию ...

Дан список, элементы которого — натуральные числа. Умножить каждый элемент на 2
Пожалуйста помогите, решением, я дноо

Уменьшить каждый 2-й элемент списка
Работаю в AutoLISP. Необходимо создать список. Реализовать функцию удаления части списка...

Удвоить каждый элемент списка
удвоить каждый элемент списка, т.е. (1 2 3) -&gt; (1 1 2 2 3 3) c использованием структуро-разрушающих...

8
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
05.02.2014, 12:13 2
cons
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
05.02.2014, 12:17  [ТС] 3
Цитата Сообщение от transformator.t Посмотреть сообщение
cons
лучший ответ,однозначно
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
05.02.2014, 12:19 4
Mashka_mulashka, краткость - сестра таланта =)

ты забыла строить список)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
29248 / 16000 / 3182
Регистрация: 12.02.2012
Сообщений: 26,341
Записей в блоге: 5
05.02.2014, 12:29 5
Для проверки четности/нечетности есть два предиката evenp (проверка на четность), oddp (проверка на нечетность).

Схема решения:

1) Если список пуст - вернуть nil
2) если голова списка четна - умножить ее на 3 и с помощью cons приделать к результату рекурсивного вызова функции на хвосте списка
3) иначе - умножить голову на 2 и см. выше


Хотя для этой задачи лаконичнее функциональное решение:

Lisp
1
2
3
4
5
6
7
8
(defun task (lst)
  (mapcar #'(lambda (x) (if (evenp x) (* x 3) (* x 2))) lst))
 
==> task
 
(task '(1 2 3 4 5))
 
==> (2 6 6 12 10)
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
05.02.2014, 12:32  [ТС] 6
Lisp
1
2
3
(defun четность (l)
 (cond((null l)nil)
  (t(cons(if(= (mod (car l) 2) 0)(*(car l) 3)))(четность (cdr l)))))
Lisp
1
(четность `(1 2 3)
Erorr in CONS:CONS requires more than one argument

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
Для проверки четности/нечетности есть два предиката evenp (проверка на четность), oddp (проверка на нечетность).

Схема решения:

1) Если список пуст - вернуть nil
2) если голова списка четна - умножить ее на 3 и с помощью cons приделать к результату рекурсивного вызова функции на хвосте списка
3) иначе - умножить голову на 2 и см. выше


Хотя для этой задачи лаконичнее функциональное решение:

Lisp
1
2
3
4
5
6
7
8
(defun task (lst)
  (mapcar #'(lambda (x) (if (evenp x) (* x 3) (* x 2))) lst))
 
==> task
 
(task '(1 2 3 4 5))
 
==> (2 6 6 12 10)

не,не,не...непонятную лямбду я использовать не собираюсь

а вот ваш алгоритм, с новыми функциями попробую сейчас
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
29248 / 16000 / 3182
Регистрация: 12.02.2012
Сообщений: 26,341
Записей в блоге: 5
05.02.2014, 12:35 7
Найди отличия:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun четность (l)
 (cond ((null l) nil)
         (t (if (= (mod (car l) 2) 0) 
             (cons (* (car l) 3) (четность (cdr l)))
             (cons (* (car l) 2) (четность (cdr l)))))))
 
 
==> четность
 
(четность '(1 2 3 4 5))
 
==> (2 6 6 12 10)
Добавлено через 55 секунд
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
не,не,не...непонятную лямбду я использовать не собираюсь
- а придётся ...

Добавлено через 55 секунд
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
Erorr in CONS:CONS requires more than one argument
- естественно... Cons нужно не просто вставить, а правильно вызвать.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
05.02.2014, 12:47  [ТС] 8
Цитата Сообщение от Catstail Посмотреть сообщение
Найди отличия:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun четность (l)
 (cond ((null l) nil)
         (t (if (= (mod (car l) 2) 0) 
             (cons (* (car l) 3) (четность (cdr l)))
             (cons (* (car l) 2) (четность (cdr l)))))))
 
 
==> четность
 
(четность '(1 2 3 4 5))
 
==> (2 6 6 12 10)
действительно.

кстати, давно хотела попросить ссылку на нормальный Common Lisp. А то у меня какой-то странный, ни скопировать, ни вставить, нажмешь стрелку вверх или вниз весь код удаляется. да и выглядит он у меня как обычное диалоговое окно.
0
Заблокирован
05.02.2014, 14:12 9
Наблюдаю за милашкой, улыбаюсь. Машеньке нужно разобраться в трех медведях: голове, хвосте и рекурсии. С ее-то интересами давно пора уже это сделать. К тому же желательно научиться точно формулировать задачу. Например, в данном случае непонятно четный ли элемент по значению или по расположению в списке нужно обрабатывать... так что оба варианта элементарные и... правильные:
Lisp
1
2
3
4
(defun четность1 (l)
 (if l (cons (* (if (evenp (car l)) 3 2) (car l)) (четность1 (cdr l)))))
(defun четность2 (l)
 (if l (cons (* 2 (car l)) (cons (* 3 (car l)) (четность2 (cddr l))))))
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2014, 14:12

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Даны два списка одинаковой длины. Проверить, что каждый элемент первого списка больше соответствующего элемента второго
Даны два списка одинаковой длины. Проверить, что каждый элемент первого списка больше...

Выбрать из списка каждый третий элемент
Выбрать из списка каждый третий элемент и возвратить их в новый список. Помогите пожалуйста, совсем...

Увеличить каждый элемент списка на единицу
Помогите пожалуйста решить задачку по Common Lisp! Никак не догоняю..:( :scratch: Дан список (...

Удалить из списка каждый второй элемент
Удалить из. списка каждый второй элемент


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.