0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 86
1

Как переделать код решенной задачи методом рекурсии на реализацию с циклами Do, и Loop

22.11.2016, 03:25. Показов 1155. Ответов 8
Метки нет (Все метки)

Дана последовательность чисел а1 ... аn. Если в результате замены отрицательных членов последовательности их квадратами, члены будут образовывать последовательность которая уменьшается, то получить сумму членов исходной последовательности, в противном случае получить их произведение.
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
(DEFUN UBV(L &OPTIONAL (B NIL))
    (COND
    ((NULL L) (SETQ B NIL))
    ((NULL(CADR L)) B)
    ((>(CAR L)(CADR L)) (UBV(CDR L)(SETQ B T)))
    (T NIL)
    ))
    
(DEFUN SUM (L &OPTIONAL (S 0))
    (COND
    ((NULL L) S)
    ((NOT (NULL L)) (SUM (CDR L) (+ S (CAR L))))
))
 
(DEFUN MUL (L &OPTIONAL (M 1))
    (COND
    ((NULL L) M)
    ((NOT (NULL L)) (MUL (CDR L) (* M (CAR L))))
))
 
(DEFUN PR1(L &OPTIONAL (L2 NIL))
       (COND
         ((AND (NULL L)(NULL L2))  NIL)
         ((AND (NOT(NULL L))(MINUSP (CAR L))) (PR1 (CDR L) (APPEND L2 (LIST(* (CAR L)(CAR L))))))
         ((AND (NOT (NULL L))(PLUSP (CAR L))) (PR1 (CDR L) (APPEND L2 (LIST (CAR L)))))
         ((AND (NULL L) (NOT (NULL L2)) (UBV L2))  (SUM L2))
         ((AND (NULL L) (NOT (NULL L2)) (NOT (UBV L2))) (MUL L2))
           ))
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2016, 03:25
Ответы с готовыми решениями:

Подскажите, как переделать код, система ДУ методом Рунге-Кутты 4-5 порядка
Уже неделю ковыряюсь с этой проблемой, облазил весь поисковик. Беру пример кода, вставляю свои...

Рекурсивно поменять в массиве две половины, зделала реализацию без рекурсии, а с рекурсией не понимаю как сделать
Рекурсивно поменять в массиве две половины. Например: Массив 6 елем. 1 2 3 4 5 6 Вывод: 4 5 6...

Конвертация решенной задачи из MathCad
Всем привет. Имеется такая задача: "Дана последовательность из n целых чисел. Найти количество...

Очередная формация давно решённой задачи
Всем доброго времени суток! Необходимо было решить задачу с 2мя кубиками: Задача: написать...

8
Модератор
Эксперт функциональных языков программированияЭксперт Python
33166 / 18496 / 3896
Регистрация: 12.02.2012
Сообщений: 31,073
Записей в блоге: 12
22.11.2016, 11:20 2
Вообще-то, решение этой задачи без рекурсии и циклов выглядит так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun task (lst)
  (let ((lst-n (mapcar (lambda (x) (if (minusp x) (* x x) x)) lst))) 
    (if (apply '> lst-n) (apply '* lst) (apply '+ lst))))
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 280000
 
(task '(1 2 3 4 -1 -2 -3))
 
==> 4
0
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 86
22.11.2016, 22:03  [ТС] 3
Нужно решить именно циклами, через Do решение и через Loop решение что б было
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
33166 / 18496 / 3896
Регистрация: 12.02.2012
Сообщений: 31,073
Записей в блоге: 12
22.11.2016, 23:08 4
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(defun task (lst)
  (let ((n (length lst))
        (r nil))
   (do ((i 0 (+ i 1)))
        ((= i n) (if (apply '< r) (apply '* lst) (apply '+ lst)))
        (let ((c (nth i lst)))
          (push (if (minusp c) (* c c) c) r))))) 
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 280000
 
(task '(1 2 3 4 -1 -2 -3))
 
==> 4
0
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 86
22.11.2016, 23:15  [ТС] 5
Спасибо а через loop как будет ?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
33166 / 18496 / 3896
Регистрация: 12.02.2012
Сообщений: 31,073
Записей в блоге: 12
23.11.2016, 12:47 6
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun task (lst)
  (let ((n (length lst))
        (r nil)
        (i 0)
        (c 0))  
   (loop
      (when (= i n) (return (if (apply '< r) (apply '* lst) (apply '+ lst))))
      (setq c (nth i lst)) 
      (push (if (minusp c) (* c c) c) r)
      (setq i (+ i 1))))) 
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 280000
 
(task '(1 2 3 4 -1 -2 -3))
 
==> 4
0
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 86
23.11.2016, 18:38  [ТС] 7
Я не могу понять как оно считает просто сами значения 280 000 и 4 почему именно так ?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
33166 / 18496 / 3896
Регистрация: 12.02.2012
Сообщений: 31,073
Записей в блоге: 12
23.11.2016, 18:50 8
Лучший ответ Сообщение было отмечено banan4ik993 как решение

Решение

banan4ik993, я немного перепутал. Правильные решения:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
;; Функциональное
 
(defun task (lst)
  (let ((lst-n (mapcar (lambda (x) (if (minusp x) (* x x) x)) lst))) 
    (if (apply '> lst-n) (apply '+ lst) (apply '* lst))))
 
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 135
 
(task '(1 2 3 4 -1 -2 -3))
 
==> -144
 
;; итерационное с DO
 
(defun task (lst)
  (let ((n (length lst))
        (r nil))
   (do ((i 0 (+ i 1)))
        ((= i n) (if (apply '< r) (apply '+ lst) (apply '* lst)))
        (let ((c (nth i lst)))
          (push (if (minusp c) (* c c) c) r))))) 
 
==> TASK
 
(task '(1 2 3 4 -1 -2 -3))
 
==> -144
 
(task '(100 -8 50 -7))
 
==> 135
 
;; Итерационное с LOOP
 
(defun task (lst)
  (let ((n (length lst))
        (r nil)
        (i 0)
        (c 0))  
   (loop
      (when (= i n) (return (if (apply '< r) (apply '+ lst) (apply '* lst))))
      (setq c (nth i lst)) 
      (push (if (minusp c) (* c c) c) r)
      (setq i (+ i 1)))))
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 135
 
(task '(1 2 3 4 -1 -2 -3))
 
==> -144
Читаем внимательно условие: "Если в результате замены отрицательных членов последовательности их квадратами, члены будут образовывать последовательность которая уменьшается" Берем список (100 -8 50 -7) и заменяем отрицательные числа их квадратами. Получаем: (100 64 50 49). Последовательность "уменьшается"? (Правильнее - убывает?) Да. Значит нужно считать сумму исходного списка 100-8+50-7=135. Для списка (1 2 3 4 -1 -2 -3) получим (1 2 3 4 1 4 9). Эта последовательность не убывает, поэтому считаем произведение 1*2*3*4* (-1)*(-2)*(-3)=-144.
1
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 86
23.11.2016, 18:54  [ТС] 9
Спасибо! Сейчас закомпилю
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2016, 18:54
Помогаю со студенческими работами здесь

Не могу понять алгоритм уже решённой задачи, может кто навести на мысли?
В общем я занимаюсь по одной книжке, в которой объясняется суть вложенных циклов. И там в один...

Как выполнить код только 1 раз в цикле loop?
Всем привет. Решил переделать автоматический освежитель воздуха. Идея такова, что после выключения...

STL-контейнер.Переделать реализацию.
Ребята, написал прогу, в которой контейнер типа вектор хранит данные класса банк, и проводит с ними...

Задачи с циклами
Кто сможет, помогите решить задачи, используя С# 1. С помощью цикла со счетчиком вывести на...

C++ задачи с циклами
Известны две скорости: одна в километрах в час, другая — в метрах в секунду. Какая из скоростей...

Задачи с циклами
Не судите строго... Помогите пожалуйста сделать вот это Напишите задание руками и создайте три...


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

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

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