14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
1

Clojure Написать функцию, для замены элементов списка y на соответствующие элементы списка x в списке w

02.11.2014, 22:57. Показов 2282. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите написать функцию, осуществляющую замену элементов списка y на соответствующие элементы списка x в списке w. Применить простую рекурсию.
например, y=(a b), x=(3 8), w=((a b) a (c (a (a d)))) -> ((3 8) 3 (c (3 (3 d)))).
Заранее всем спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2014, 22:57
Ответы с готовыми решениями:

Clojure Написать функцию, вычисляющую количество троек подряд идущих элементов числового списка
написать функцию, вычисляющую кол-во троек подряд идущих элементов числового списка, в каждой из...

написать функцию которая вычисляет разность множеств X\Y, т.е. исключает из списка X все элементы, встречающиеся в списке Y
написать функцию которая вычисляет разность множеств X\Y, т.е. исключает из списка X все элементы,...

Clojure Определить функцию переставляющую элементы списка L таким образом, чтобы одинаковые элементы оказались рядом
Переставляющую элементы списка L таким образом, чтобы одинаковые элементы оказались рядом. ...

Clojure Определить функцию, вычисляющую минимальный и максимальный элементы списка
1. Определить функцию, вычисляющую минимальный и максимальный элементы списка, значения которого...

11
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
03.11.2014, 00:31 2
Lisp
1
2
3
4
5
6
7
8
9
10
(defun replace-atom (w v z &aux (a (car w)) (d (cdr w)))
  (cond ((null w) nil)
        ((atom a) (cons (if (member a v)
                            (nth (position a v) z)
                            a)
                        (replace-atom d v z)))
        ((cons (replace-atom a v z) (replace-atom d v z)))))
 
> (replace-atom '((a b) a (c (a (a d)))) '(a b) '(3 8))
((3 8) 3 (C (3 (3 D))))
Lisp
1
2
3
4
5
6
7
8
9
10
(defun replace-atom (w v z &aux (a (car w)) (d (cdr w)))
  (when w (cons (if (atom a)
                    (if (member a v)
                        (nth (position a v) z)
                        a)
                    (replace-atom a v z))
                (replace-atom d v z))))
 
> (replace-atom '((a b) a (c (a (a d)))) '(a b) '(3 8))
((3 8) 3 (C (3 (3 D))))
Lisp
1
2
3
4
5
6
7
8
9
10
(defun replace-atom (w v z &aux (a (car w)))
  (when w (cons (if (atom a)
                    (if (member a v)
                        (nth (position a v) z)
                        a)
                    (replace-atom a v z))
                (replace-atom (cdr w) v z))))
 
> (replace-atom '((a b) a (c (a (a d)))) '(a b) '(3 8))
((3 8) 3 (C (3 (3 D))))
вариант с циклами:
Lisp
1
2
3
4
5
6
7
8
9
10
(defun replace-atom (w v z)
  (loop for a in w
        collect (if (atom a)
                    (if (member a v)
                        (nth (position a v) z)
                        a)
                    (replace-atom a v z))))
 
> (replace-atom '((a b) a (c (a (a d)))) '(a b) '(3 8))
((3 8) 3 (C (3 (3 D))))
3
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
03.11.2014, 01:07 3
Clojure:
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
(ns learn-clojure.example
  (:require [clojure.walk :refer [postwalk-replace]]
            [clojure.zip :as z]))
 
(defn task [y x coll]
  (postwalk-replace (zipmap y x) coll))
;; => #'learn-clojure.example/task
 
(task '(a b) '(3 8) '((a b) a (c (a (a d)))))
;; => ((3 8) 3 (c (3 (3 d))))
 
;; or
 
(defn task [y x coll]
  (loop [loc (z/seq-zip coll)]
    (if (z/end? loc)
      (z/root loc)
      (if-let [[_ v] (find (zipmap y x) (z/node loc))]
        (recur (z/next (z/replace loc v)))
        (recur (z/next loc))))))
;; => #'learn-clojure.example/task
 
(task '(a b) '(3 8) '((a b) a (c (a (a d)))))
;; => ((3 8) 3 (c (3 (3 d))))
3
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
03.11.2014, 03:59 4
Lisp
1
2
3
4
5
6
7
8
9
10
;;; racket-lang.org
(define (foo y x w)
  (define (replace a (src y) (needle x))
    (cond [(empty? src) a]
          [(eq? a (first src)) (first needle)]
          [(replace a (rest src) (rest needle))]))
  (map (lambda (i) (if (pair? i) (foo y x i) (replace i))) w))
 
(foo '(a b) '(3 8) '((a b) a (c (a (a d)))))
;'((3 8) 3 (c (3 (3 d))))
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36823 / 20385 / 4229
Регистрация: 12.02.2012
Сообщений: 33,744
Записей в блоге: 13
03.11.2014, 08:55 5
Поскольку position возвращает Nil, если не находит вхождение первого аргумента, то можно так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun repl (lst w r)
  (cond ((null lst) nil)
        ((listp (car lst)) (cons (repl (car lst) w r) (repl (cdr lst) w r)))
        (t (let ((p (position (car lst) w)))
                 (if p (cons (nth p r) (repl (cdr lst) w r))
                       (cons (car lst) (repl (cdr lst) w r)))))))
 
==> repl
 
(repl '((a b) a (c (a (a d)))) '(a b) '(3 8))
 
==> ((3 8) 3 (c (3 (3 d))))
2
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
03.11.2014, 21:42  [ТС] 6
Спасибо огромное. Сейчас сижу разбираюсь, но только ошибки выдает по каждой программе. Сейчас пытаюсь понять в чем загвоздка.

Добавлено через 6 часов 48 минут
Помогите разобраться с кодом, выдает ошибки, сам разобраться не могу. Заранее спасибо.
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
03.11.2014, 22:04 7
Jin200611, какой у Вас диалект Лиспа?

Добавлено через 5 минут
Сначала:
Lisp
1
2
3
4
5
6
7
(defun replace-atom (w v z)
  (cond ((null w) nil)
        ((atom (car w)) (cons (if (member (car w) v)
                            (nth (position (car w) v) z)
                            (car w))
                        (replace-atom (cdr w) v z)))
        (t (cons (replace-atom (car w) v z) (replace-atom (cdr w) v z)))))
Затем:
Lisp
1
2
CL-USER> (replace-atom '((a b) a (c (a (a d)))) '(a b) '(3 8))
((3 8) 3 (C (3 (3 D))))
1
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
03.11.2014, 22:18  [ТС] 8
Спасибо за ответ. XLisp+ 2.1d. Выдает ошибку: unbound function - POSITION.
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
03.11.2014, 22:27 9
Лучший ответ Сообщение было отмечено Jin200611 как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun replace-atom (w v z)
  (cond ((null w) nil)
        ((atom (car w)) (cons (if (member (car w) v)
                            (nth (our-position (car w) v 0) z)
                            (car w))
                        (replace-atom (cdr w) v z)))
        (t (cons (replace-atom (car w) v z) (replace-atom (cdr w) v z)))))
 
(defun our-position (a w n)
  (cond ((null w) nil)
        ((eq (car w) a) n)
        (t (our-position a (cdr w) (+ n 1)))))
 
> (replace-atom '((a b) a (c (a (a d)))) '(a b) '(3 8))
((3 8) 3 (C (3 (3 D))))
1
helter
03.11.2014, 22:30
  #10

Не по теме:

Во, нашёл ченжлог этого XLisp-а: http://www.almy.us/changelog.txt . Господи ж ты боже мой, девяносто второй год... Как живого вижу старенького препода, который дрожащими руками раздаёт задания: "Написать функцию, осуществляющую замену элементов..."

0
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
03.11.2014, 22:37  [ТС] 11
Огромное спасибо _sg, выручили, все идет как надо.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36823 / 20385 / 4229
Регистрация: 12.02.2012
Сообщений: 33,744
Записей в блоге: 13
04.11.2014, 10:18 12
Если старая версия XLisp не содержит реализации position, то можно определить ее:
Миниатюры
Clojure Написать функцию, для замены элементов списка y на соответствующие элементы списка x в списке w  
1
04.11.2014, 10:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2014, 10:18
Помогаю со студенческими работами здесь

Clojure Создать два списка, поместив в первый отрицательные, а во второй – положительные элементы исходного списка
Помогите пожалуйста решить следующие задачи: 1. Задан список чисел. Создать два списка, поместив...

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

Clojure Используя функцию Defun, определить функцию f(a x), где а-S- выражение, а х-список, состоящий из 2-3 элементов, которая заменяет на а все атомы списка
1)Используя функцию Defun, определить функцию f(a x), где а-S- выражение, а х-список, состоящий из...

Написать программу замены элементов списков первого уровня на элементы списка самого низкого уровня в цикл
Пажалуйста помогите с задачкой Пример: (((a)) (b) (((c) e)) (((d)))) -> ((c) (d) (c) (d))


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru