Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
1

Проход по элементам списка

02.02.2014, 09:14. Просмотров 2927. Ответов 17
Метки нет (Все метки)


определить функцию ДОБАВЬ прибавляющую к элементам списка заданное число.

Lisp
1
(defun добавь (x y) (cond ((null x) `stop)(t(+ y (добавь (car x)))))))
Lisp
1
==> добавь
Lisp
1
(добавь `(1 2 3) 5)
Lisp
1
Error in x [or a callee]: X [or a callee] requires more than one argument
оно и понятно, ведь после выполнения

Lisp
1
(t(+ y (добавь (car x)))
из списка `(1 2 3) останется только еденица.

не совсем понятно, как идти по элементам списка. но вообще идея была такова: делаем car списка и прибавляем к нему число, затем еще раз car и т.д. пока не останется пустой
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2014, 09:14
Ответы с готовыми решениями:

Найти среднее значение всех элементов списка за один проход
Здравствуйте, не могу понять как это за один проход. Написал программу которая вычисляет сумму,...

Не идет проход по элементам списка
#include <stdio.h> #include <conio.h> #include <windows.h> #include <string.h> #define N 100;...

Проход по элементам односвязного линейного списка
Допустим у меня существует класс линейного односвязного списка. Надо пройти по его элементам и...

Проход по элементам массива
Всем доброго времени суток! У меня сложилась такая вот дилемма. String qu= {"Что тут?", "А...

17
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
02.02.2014, 10:11 2
Lisp
1
2
3
4
5
6
7
8
(defun добавить (x y)
  (cond 
    ((null x) nil)
    (t (cons (+ y (car x)) (добавить (cdr x) y)))))
 
 (добавить '(1 2 3 4 5) '5)
 
==> (6 7 8 9 10)
3
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
02.02.2014, 10:38  [ТС] 3
Цитата Сообщение от route66 Посмотреть сообщение
(t (cons (+ y (car x)) (добавить (cdr x) y)))))
если t, то соединяем сумму первого элемента и.....(добавить (cdr x) y))))) - что это делает? вызывает рекурсивно функцию, отсекая голову старого списка?
0
Модератор
Эксперт Python
28371 / 15271 / 3010
Регистрация: 12.02.2012
Сообщений: 25,000
Записей в блоге: 4
02.02.2014, 11:33 4
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
(defun добавь (x y) (cond ((null x) `stop)(t(+ y (добавь (car x)))))))
- жжешь!

Первое правило составления подобных программ гласит: раз функция должна вернуть список, то любая ветвь рекурсии должна возвращать тоже список!. Смотрим на код и видим:

Lisp
1
2
3
...
((null x) `stop)
...
Эта функция (даже если бы она доработала до конца) вернула бы (нечто нечто ... нечто . stop), что неверно. А теперь посмотрим сюда:

Lisp
1
(t (+ y (добавь (car x))))
Здесь y прибавляется к... результату вызова нашей функции к голове списка. Во-первых, вызов функции требует двух параметров, во-вторых - первый параметр быть списком.

Короче - каша.

Вот начало решения:

1) если исходный список пуст - должен быть пуст и результат
2) иначе прибавляем y к голове списка, и этот результат сложения приделываем как голову к результату рекурсивного вызова нашей функции на хвосте списка.

Попробуй это реализовать.
1
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
02.02.2014, 11:53  [ТС] 5
Catstail

это уже реализовал человек с ником route66 2 поста назад
0
Модератор
Эксперт Python
28371 / 15271 / 3010
Регистрация: 12.02.2012
Сообщений: 25,000
Записей в блоге: 4
02.02.2014, 12:07 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
это уже реализовал человек с ником route66 2 поста назад
- то, что route66 в состоянии решить такую задачу, сомнений не вызывает. Ты же как-то просила не давать готовых решений, а только подсказывать...

Добавлено через 7 минут
Решить эту задачу можно многими способами:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(defun add-n (lst n)   ;; функциональное решение
  (mapcar #'(lambda (x) (+ x n)) lst))
 
==> add-n
 
(add-n '(1 2 3 4 5) 11)
 
==> (12 13 14 15 16)
 
(defun add-n (lst n)  ;; итерационное решение 1
  (iter (for x in lst) (collecting (+ x n))))
 
==> add-n
 
(add-n '(1 2 3 4 5) 11)
 
==> (12 13 14 15 16)
 
(defun add-n (lst n)  ;; итерационное решение 2
  (let ((r nil))
    (dolist (x lst (reverse r))
      (push (+ x n) r))))
 
==> add-n
 
(add-n '(1 2 3 4 5) 11)
 
==> (12 13 14 15 16)
 
 
(defun add-n (lst n &optional r) ;; рекурсия с накопительным параметром
  (if (null lst) (reverse r) (add-n (cdr lst) n (cons (+ n (car lst)) r))))
 
==> add-n
 
(add-n '(1 2 3 4 5) 11)
 
==> (12 13 14 15 16)
Пригодится...
2
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
02.02.2014, 12:36  [ТС] 7
Цитата Сообщение от Catstail Посмотреть сообщение
- то, что route66 в состоянии решить такую задачу, сомнений не вызывает. Ты же как-то просила не давать готовых решений, а только подсказывать...
когда кто-то пишет решение, хочешь-не хочешь, а начинаю вчитываться и разобрать код, потом себе его записываю в тетрадку
1
Модератор
Эксперт Python
28371 / 15271 / 3010
Регистрация: 12.02.2012
Сообщений: 25,000
Записей в блоге: 4
02.02.2014, 12:49 8
В целом - правильный подход.
0
4320 / 3329 / 339
Регистрация: 12.03.2013
Сообщений: 5,828
02.02.2014, 16:01 9
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
когда кто-то пишет решение, хочешь-не хочешь, а начинаю вчитываться и разобрать код, потом себе его записываю в тетрадку
В целом - порочный подход. Надо думать своей головой и писать своими руками. Нужно производить, а не потреблять. Но с этим форумом трудно, да.
1
Модератор
Эксперт Python
28371 / 15271 / 3010
Регистрация: 12.02.2012
Сообщений: 25,000
Записей в блоге: 4
02.02.2014, 18:12 10
Цитата Сообщение от helter Посмотреть сообщение
Надо думать своей головой и писать своими руками.
- золотые слова! +100!!!
Волга впадает в Каспийское море. Грипп опасен осложнениями... А если без ёрничания - учиться на чужих исходниках можно (и иногда даже нужно). Если обучаемый языком не владеет - он сам ничего сразу и не напишет.
0
4320 / 3329 / 339
Регистрация: 12.03.2013
Сообщений: 5,828
02.02.2014, 18:19 11
Извините, учиться на чужих исходниках - это взять cl-ppcre и разбирать. А задачи надо решать самому, а не наблюдать, как другие это делают за тебя. Если бы кого заботило обучение - ну, привели бы решение других подобных задач, если уж человек не может другим образом пояснить. Или на другом диалекте. А если группа товарищей вываливает решения лабораторных десятками вариантов, какой студент напишет хоть строчку кода? Зато - ни фига ж себе, мы умеем разнообразно решать задачи для первокурсников.
0
Модератор
Эксперт Python
28371 / 15271 / 3010
Регистрация: 12.02.2012
Сообщений: 25,000
Записей в блоге: 4
02.02.2014, 18:31 12
Цитата Сообщение от helter Посмотреть сообщение
Извините, учиться на чужих исходниках - это взять cl-ppcre и разбирать. А задачи надо решать самому,
- не ощущаю разницы. Кстати ТС писала что-то вроде: "Переписываю и разбираю код". Если это - не ученье, то что?

Цитата Сообщение от helter Посмотреть сообщение
Зато - ни фига ж себе, мы умеем разнообразно решать задачи для первокурсников.
- ну, так я тоже учусь

Добавлено через 4 минуты
Цитата Сообщение от helter Посмотреть сообщение
какой студент напишет хоть строчку кода?
- самолюбивый.

Добавлено через 2 минуты
Цитата Сообщение от helter Посмотреть сообщение
Или на другом диалекте.
- правила дидактики просты: усилия нужно концентрировать. Студентке, еще не принявшей методологию Лиспа, делающей ошибки в синтаксисе решение на Scheme ничем не поможет... Изучать параллельно два языка может человек достаточно продвинутый.
0
4320 / 3329 / 339
Регистрация: 12.03.2013
Сообщений: 5,828
02.02.2014, 18:32 13
Цитата Сообщение от Catstail Посмотреть сообщение
- не ощущаю разницы. Кстати ТС писала что-то вроде: "Переписываю и разбираю код". Если это - не ученье, то что?
Это бред. Чтобы научиться писать, надо писать, а не читать, см. выше мои золотые слова.

Цитата Сообщение от Catstail Посмотреть сообщение
- ну, так я тоже учусь
Я не думаю, что вы застряли на уровне первокурсника. Есть другие задачи. Например, с вашим опытом лиспописания вы, наверно, могли бы взяться за поддержку ECL (которая сейчас заморожена, насколько знаю). Или принять участие в разработке ASDF 3. Или написать обёртку для tk через FFI и утереть нос LTK. Или взять какую-нибудь библиотеку и сделать её лучше (например, пофиксить какой-нибудь py-configparser). Или...
1
Модератор
Эксперт Python
28371 / 15271 / 3010
Регистрация: 12.02.2012
Сообщений: 25,000
Записей в блоге: 4
02.02.2014, 18:49 14
Цитата Сообщение от helter Посмотреть сообщение
Это бред. Чтобы научиться писать, надо писать, а не читать
- Грубовато, но неубедительно. Чтобы писать, нужно сначала научиться читать. Разве нет?

Добавлено через 12 минут
Кстати и я изучаю чужие исходники. И Ваши, helter, и NamelessOne и sg_ и других участников. Это явно небесполезно.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
02.02.2014, 20:45  [ТС] 15
мой подход дает свои результаты. сегодня я пыталась сделать 4 задачи. из них первые 2 не получилось, выложила сюда. узнала что-то новое, некоторые моменты языка, ито г- 2 задачи решила сама. значит день прошел не зря и чему-то научилась.
1
2303 / 1061 / 77
Регистрация: 12.03.2013
Сообщений: 4,978
02.02.2014, 20:47 16
Цитата Сообщение от helter Посмотреть сообщение
Или написать обёртку для tk через FFI и утереть нос LTK.
О да. Давно пора.
0
Памирыч
02.02.2014, 20:48
  #17
 Комментарий модератора 
Оффтоп прекращаем
0
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
02.02.2014, 21:17 18
Лучший ответ Сообщение было отмечено как решение

Решение

На днях попалась статья Code is Not Literature - рассуждения как раз на тему чтения чужого кода.
Запомнился оттуда фрагмент про то, как Кнут однажды взялся разбирать очень мутный (неструктурное программирование), но весьма быстро работающий код на Фортране, пытаясь выявить, чем он так хорош. Там была фраза:
"The more you learn to read other people’s stuff, the more able you are to invent your own in the future." (Donald Knuth)
Копаться в чужом коде - занятие не всегда приятное, но отнюдь небесполезное, правда польза от этого будет только в том случае, если попробовать применить усвоенное на практике, сделать какие-то свои выводы, т.е. опять-таки "решить задачу", но по-своему.

Mashka_mulashka, но задачи такого уровня обычно описываются в рамках учебных материалов. вам не выдавали план-конспект?

Чтобы не было оффтопа:

Lisp
1
2
3
4
5
6
(defun F (l n)
    (mapcar #'(lambda (x) (+ x n)) l))
 
(f '(1 2 3 4 5) '5)
 
==> (6 7 8 9 10)
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2014, 21:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

mpl проход по элементам
Пытался написать вывод элементов vector_c не через for_each. Не вышло. Кто подскажет как сие...

CheckListBox автоматический проход по элементам
Друзья помогите как в компоненте CheckListBox снять все галочки с Items for(int i = 0; i <...

Проход по всем элементам MenuStrip и NullReferenceException was unhandled
Добрый день! Сразу скажу, что в программировании я неселен. Для облегчения своей работы...

Вычесть из суммы списка его максимум и минимум за один проход списка
Если список меньше двух элементов, вывести ноль. Никак не могу сообразить, как это провернуть. На...

Проход по всем элементам некоторого типа объектов, расположенных на форме
Приветствую. Есть серия кнопок TSpeedButton на форме. Возможно-ли пройти циклом по ним (будто это...

[tasm] Как сделать проход по всем элементам ниже побочной диагонали матрицы
Добрый день(вечер). Использую тасм. Возникла небольшая проблема при написании кода. В общем ломаю...


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

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

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