Знатокам ЛИСП
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Знатокам ЛИСП

Знатокам ЛИСП

Ответ
Поиск в этой теме
Непрочитано 09.04.2006, 10:14 #1
Знатокам ЛИСП
snake666
 
Программист
 
Нерюнгри
Регистрация: 09.04.2006
Сообщений: 2

Мое задание
Определите функцию (f s n) которая из списка чисел s создает новый список, прибавляя к каждому атому число n. Исходный список не предполагается одноуровневым.

Я выполнил так

; Задание 3
(defun f(s n)
(cond ((null s) nil)
((if (atom (car s))
(f (cdr s) n))
(cons (f (car s) n) (f (cdr s) n)) )
(t (cons (+ (car s) n) (f (cdr s) n))) )
)


Рецензия препода

Как сказано в условии, список не предполагается одноуровневым.
Поэтому, если вызываем функцию в виде
> (f ‘ (5 6 (8 7)) 10)
должно получаться
(15 16 (18 17))
а ваша программа выдает ошибку.


ПОМОГИТЕ ИСПРАВИТЬ ОШИБКУ, ЧТО ТО НЕ ПОЙМУ Я НИКАК
Буду всем признателен пишите snake666@mail.ru
__________________
С Уважением
Просмотров: 3031
 
Непрочитано 09.04.2006, 14:31
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Если ты догадался то в случае если элемен есть список
то к нему применяется эта же рекурсия:

Код:
[Выделить все]
(defun f (s n) 
(cond ((null s) nil) 
((atom (car s)) 
(cons (+ (car s) n) (f (cdr s) n)))
((listp (car s)) 
(cons (f (car s) n) (f (cdr s) n)))      
(t nil)))
~'J'~
fixo вне форума  
 
Непрочитано 09.04.2006, 16:00
#3
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


И кстати тут прям как для тебя написано:

http://www.autocad.ru/cgi-bin/f1/board.cgi?t=25113OT

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 10.04.2006, 07:04 Спасибо
#4
snake666

Программист
 
Регистрация: 09.04.2006
Нерюнгри
Сообщений: 2
<phrase 1=


Огромное спасибо, а то я бы наверное долго ломал бы голову
__________________
С Уважением
snake666 вне форума  
 
Непрочитано 24.05.2007, 14:36
#5
ki

Constructor
 
Регистрация: 28.09.2005
SPb
Сообщений: 689
<phrase 1= Отправить сообщение для ki с помощью Skype™


Привет всем.
Новую тему решил не создавать, спрошу здесь.
Ниже приведу два варианта кода, в первом случае выдается ошибка: первая точка считывается из файла, на второй выдается ошибка и прерывание функции. Во втором случае все выполняется, но это не верный подход.
Цитата:
(setq name (getfiled "Файлы .txt" "C:\\" "txt" 0))
;;получение пути к файлу
(setq mfile (open name "r"))
;;открытие файла
(setq toch (read (read-line mfile)))
;;чтение из файла первой строки и получение количества точек

(setq M (* toch 2))

(command "_3dmesh" toch 2
(repeat M

(read (read-line mfile))

)
"")
(close mfile)
(setq mfile nil)
Цитата:
(setq name (getfiled "Файлы .txt" "C:\\" "txt" 0))
;;получение пути к файлу
(setq mfile (open name "r"))
;;открытие файла
(setq toch (read (read-line mfile)))
;;чтение из файла первой строки и получение количества точек

(setq M (* toch 2))

(command "_3dmesh" toch 2 (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) (read (read-line mfile)) "")
(close mfile)
(setq mfile nil)
Количество повторений во втором примере 20, но ведь точек может быть и больше, и меньше.
А это файл, из которого читаются данные:
Цитата:
10
(0 0 0)
(0 0 10)
(5 5 0)
(5 5 15)
(10 0 0)
(10 0 20)
(0 -15 0)
(0 -15 25)
(-20 0 0)
(-20 0 30)
(0 25 0)
(0 25 35)
(30 0 0)
(30 0 40)
(0 -35 0)
(0 -35 45)
(-40 0 0)
(-40 0 50)
(0 45 0)
(0 45 55)
Смысл всего этого в том, что для 3dmesh нужно получить из файла количество точек (используется для определения размера сети в напр. М) и координаты для всех точек сети.
__________________
Для ухода за пожилым программистом требуется приятная женщина, говорящая на FОRTRАN, BАSIС и С++
ki вне форума  
 
Непрочитано 24.05.2007, 15:03
#6
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


навскидку, попробуйте так:
Код:
[Выделить все]
(setq name (getfiled "Файлы .txt" "C:\\" "txt" 0)) 
;;получение пути к файлу 
(setq mfile (open name "r")) 
;;открытие файла 
(setq toch (read (read-line mfile))) 
;;чтение из файла первой строки и получение количества точек 
(setq M (* toch 2)) 
(command "_3dmesh" toch 2) 
(repeat M 
(command (read (read-line mfile)))
(command " ")
) 
(command "") (close mfile) 
(setq mfile nil)
Zouss вне форума  
 
Непрочитано 24.05.2007, 15:25
#7
ki

Constructor
 
Регистрация: 28.09.2005
SPb
Сообщений: 689
<phrase 1= Отправить сообщение для ki с помощью Skype™


Не, не выходит каменный цветок.
Вот что выдает:
Цитата:
Команда: _3dmesh
Размер сети в направлении M: 10
Размер сети в направлении N: 2
Положение вершины (0, 0):
Положение вершины (0, 1):
Неверная точка.
; ошибка: Функция отменена
Положение вершины (0, 1):
Дальше либо прерывать, либо руками вводить. Т.е. как и было, первую точку считывает, а дальше "ломается" на цикле. Мне кажется, что идет попытка обработать то, что выдает repeat при проверке и поэтому получаем неверную точку.
__________________
Для ухода за пожилым программистом требуется приятная женщина, говорящая на FОRTRАN, BАSIС и С++
ki вне форума  
 
Непрочитано 24.05.2007, 16:47
#8
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


попробуйте такой вариант
Код:
[Выделить все]
  (setq name (getfiled "Файлы .txt" "C:\\" "txt" 0))
  ;;получение пути к файлу 
  (setq mfile (open name "r"))
  ;;открытие файла 
  (setq toch (read (read-line mfile)))
  ;;чтение из файла первой строки и получение количества точек 
  (setq M (* toch 2))
  (command "_3dmesh" toch 2)
  (while (setq z (read-line mfile))
    (command (read z))
  ) ;_  while
  (command)
  (close mfile)
  (setq mfile nil)
  (princ)
Zouss вне форума  
 
Непрочитано 24.05.2007, 17:25
#9
ki

Constructor
 
Регистрация: 28.09.2005
SPb
Сообщений: 689
<phrase 1= Отправить сообщение для ki с помощью Skype™


Спасибо большое, все заработало. [sm158]
В данном случае while проверяет получила ли z значение?
__________________
Для ухода за пожилым программистом требуется приятная женщина, говорящая на FОRTRАN, BАSIС и С++
ki вне форума  
 
Непрочитано 24.05.2007, 17:56
#10
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


в данном случае да
такой код работает тоже
Код:
[Выделить все]
  (setq name (getfiled "Файлы .txt" "C:\\" "txt" 0))
  ;;получение пути к файлу 
  (setq mfile (open name "r"))
  ;;открытие файла 
  (setq toch (read (read-line mfile)))
  ;;чтение из файла первой строки и получение количества точек 
  (setq M (* toch 2))
  (command "_3dmesh" toch 2)
  (repeat M
    (setq z (read-line mfile))
    (command (read z))
  ) ;_  repeat
  (command)
  (close mfile)
  (setq mfile nil)
  (princ)
проблема, как вы видите была в том, что цикл был вложен в одну-единственную функцию (command, которой благополучно передавалась последняя точка, а затем следовало ентер в виде ""), на что acad говорил invalid point... так что в некотором роде прога была работоспособной, только трудилась неправильно
Zouss вне форума  
 
Непрочитано 26.05.2007, 08:12
#11
bad_boy


 
Регистрация: 26.05.2007
Абакан
Сообщений: 1


Помогите разобраться с задачами! Ничего не получается.
Вот первая.
$ (defun rec(n)
(_> (if (< n 2) 1
((_> (+ (rec (- n 1)) n)))
REC
_$ rec 50
Нужно сумму посчитать из n элементов т.е. 1+2+3+..n. Что неправильно в коде?
2 задача.
Алгебраическая прогрессия
_$ (defun rec(n)
(if (< n 2) 2
(+ (rec (- n 1)) (+ n (- n 1)))))
REC
_$ (rec 10)
101
Должно получиться 110 а он 101 выдает!
3 задача!!!!
Геометрическая прогрессия!
тоже не работает
(if (< n 2) 2
(+ (rec (- n 1)) (* (rec (- n 1)) 2) )))
REC
_$ (rec 10)
4 задача.
(defun fib(n)
(if (< n 1) 1
(+ (fib (- n 1) ) (fib (- n 2) ))))

(defun rec(n)
(if (< n 1) 0
(+ (fib n) (rec (- n 1)))))
тоже не работает! Помогите!!!! Умоляю

Все программы нужно сделать с помощью рекурсии!!! Помогите люди добрые!!!!!
bad_boy вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Знатокам ЛИСП