Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 19.11.2010
Сообщений: 38
1

Обработка списков рекурсивным методом

29.12.2012, 12:01. Просмотров 958. Ответов 10
Метки нет (Все метки)

Привет всем!
Вот мучаюсь с объединением списков без применения операторов циклов; функций прямого доступа к элементам список, такие как nth, elt, aref, высокоуровневые операторы обработки списков, такие как append, reverse, nconc, функционалы, все виды оператора set, оператор prog.
Разработать функцию, осуществляющую вставку в исходный список подсписка за элементом с номером N.
Например:
Вход: (1 2 3 4 5 6), (a b c), N = 3.
Выход: (1 2 3 a b c 4 5 6).
С применением if и append все работает,
(defun paste (list k n) - объявление функции (лямбда-выражения) вставки подсписка и переменных:
list – список, k – подсписок, n – позиция вставки подсписка.
задаем условие, если позиция вставки подсписка = 1:
(if (= n 1)
объединяем(append) подсписок k и список list:
(append k list)
берем голову списка и объединяем с хвостом списка после помещения подсписка по указанной позиции:
(cons (car list) (paste (cdr list) k (1- n)))))
==>PASTE

Проверим: (paste '(1 2 3 4 5 6) '(a b c) 4)
==>(1 2 3 A B C 4 5 6)

а как с применением cond сделать не могу ничего наколдовать ток это
Lisp
1
2
3
(defun paste (list k n)  
  (cond ((= n 1) (cons k list))
      (cons (car list) (paste (cdr list) k (1- n))))
CL-USER 12 : 5 > (paste '(1 2 3 4 5 6) '(a b c) 1)
((A B C) 1 2 3 4 5 6)

Может кто сталкивался??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2012, 12:01
Ответы с готовыми решениями:

Обработка списков
1. Используя только CAR и CDR вытащить 'aaa' и следующего списка: (((( ddd (aaa)) eee) nnn) kkk) ...

Обработка списков
сессия, хелп :( кто чем может :( Заранее пасибо 1) Удалить из списка все элементы, большие...

Обработка списков
Реализовать на Scheme: Определите следующие процедуры для обработки списков: Процедуру...

Арифметика и обработка списков в LISP. Задание функций
Задание: Реализовать средствами Лиспа пользовательские функции: a. uf1(x)=tan(x/8)+ctn(x/8) b....

10
Модератор
26252 / 13666 / 2594
Регистрация: 12.02.2012
Сообщений: 22,398
29.12.2012, 12:18 2
Пойдет?

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(defun ins-r (lst ins n)
  (cond ((= n 0) (append ins lst))
        (t (cons (car lst) (ins-r (cdr lst) ins (- n 1))))))
 
==> ins-r
 
(ins-r '(1 2 3 4) '(11 22) 2)
 
==> (1 2 11 22 3 4)
 
(ins-r '(1 2 3 4) '(11 22) 0)
 
==> (11 22 1 2 3 4)
 
(ins-r '(1 2 3 4) '(11 22) 1)
 
==> (1 11 22 2 3 4)
1
4324 / 4052 / 320
Регистрация: 12.05.2012
Сообщений: 2,861
29.12.2012, 12:41 3
Lisp
1
2
3
4
5
6
(defun insert-elms (w v n)
  (cond ((zerop n) (nconc v w))
        ((cons (car w) (insert-elms (cdr w) v (1- n))))))
 
> (insert-elms nil '(a b c) 0)
(A B C)
1
2 / 2 / 0
Регистрация: 19.11.2010
Сообщений: 38
29.12.2012, 12:45  [ТС] 4
Спасибо! Пойдет конечно, код работает, только еще бы append не использовать.
0
4324 / 4052 / 320
Регистрация: 12.05.2012
Сообщений: 2,861
29.12.2012, 12:47 5
Lisp
1
2
3
4
5
6
(defun insert-elms (w v n)
  (cond ((zerop n) (append v w))
        ((cons (car w) (insert-elms (cdr w) v (1- n))))))
 
> (insert-elms nil '(a b c) 0)
(A B C)
0
2 / 2 / 0
Регистрация: 19.11.2010
Сообщений: 38
29.12.2012, 12:47  [ТС] 6
Цитата Сообщение от _sg Посмотреть сообщение
Lisp
1
2
3
4
5
6
(defun insert-elms (w v n)
  (cond ((zerop n) (nconc v w))
        ((cons (car w) (insert-elms (cdr w) v (1- n))))))
 
> (insert-elms nil '(a b c) 0)
(A B C)
Спасибо! но тут тоже nconc а по условию его нельзя использовать, хех
0
4324 / 4052 / 320
Регистрация: 12.05.2012
Сообщений: 2,861
29.12.2012, 12:49 7
nconc быстрее append

Добавлено через 1 минуту
Lisp
1
2
3
(defun insert-elms (w v n)
  (cond ((zerop n) (append v w))
        ((cons (car w) (insert-elms (cdr w) v (1- n))))))
1
Модератор
26252 / 13666 / 2594
Регистрация: 12.02.2012
Сообщений: 22,398
29.12.2012, 12:51 8
Когда говорят "не использовать append", это означает "либо не используй, либо реализуй сам/сама". С этими поправками:


Lisp
1
2
3
4
5
6
7
8
9
10
(defun append! (lst1 lst2)
  (cond ((null lst1) lst2)
        ((null lst2) lst1)
        (t (cons (car lst1) (append! (cdr lst1) lst2)))))
 
==> append!
 
(append! '(1 2 3) '(4 5 6))
 
==> (1 2 3 4 5 6)
Добавлено через 1 минуту
Цитата Сообщение от _sg Посмотреть сообщение
nconc быстрее append
- естественно. Но это структуроразрушающая функция. Впрочем, запрета, вроде бы не было...
1
2 / 2 / 0
Регистрация: 19.11.2010
Сообщений: 38
29.12.2012, 12:55  [ТС] 9
а сделать данное объединение списка и подсписка, не применяя операторы циклов, не применяя функций прямого доступа к элементам список, такие как nth, elt, aref, не применяя высокоуровневые операторы обработки списков, такие как append, reverse, nconc, функционалы, все виды оператора set, оператор prog....это осуществимо??

Добавлено через 3 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
Когда говорят "не использовать append", это означает "либо не используй, либо реализуй сам/сама". С этими поправками
Спасибо)) Двоякий смысл, попробуй тут угадай чего хотят)) это из области "Быть или не быть".
0
Модератор
26252 / 13666 / 2594
Регистрация: 12.02.2012
Сообщений: 22,398
29.12.2012, 12:59 10
А так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun paste (lst1 lst2 n)
  (cond ((= n 0) 
         (cond ((null lst2) lst1)
               (t (cons (car lst2) (paste lst1 (cdr lst2) 0)))))
        (t (cons (car lst1) (paste (cdr lst1) lst2 (- n 1))))))
 
 
==> paste
 
(paste '(1 2 3 4 5) '(a b) 0)
 
==> (a b 1 2 3 4 5)
 
(paste '(1 2 3 4 5) '(a b) 2)
 
==> (1 2 a b 3 4 5)
1
2 / 2 / 0
Регистрация: 19.11.2010
Сообщений: 38
29.12.2012, 13:05  [ТС] 11
Да вот это то, что нужно! Спасибо, буду разбираться в коде, что откуда и куда))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2012, 13:05

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

Обработка списков
В коде, в строке head_list(list). появилась ошибка No clauses for this predicate. Но...

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

Обработка списков
Помогите пожайлуста!!! Задание: 1. Создать список, состоящий из значений первых аргументов...

Обработка списков
Здравствуйте Дано задание: Построить список ,4]],5], используя только числовые значения и...

Обработка списков
Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3,...

Обработка списков
Список состоит из букв и цифр, буквы оставить без изменения, а цифры умножить на 2.


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

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

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