0 / 0 / 0
Регистрация: 16.10.2015
Сообщений: 24

В задаче нужно использовать рекурсию. Вообще не понимаю эту тему :(

22.10.2015, 16:44. Показов 1175. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На форуме уже есть эта задача, а решения стоящего нет

Связать базу данных (потомок, родители) с глобальной переменной FAMILY:
Lisp
1
2
3
4
5
6
(setf family ’((colin nil nil) (deirdre nil nil) (arthur nil nil) (kate nil nil) (franknil nil) (linda nil nil) 
(suzanne colin deirdre) (bruce arthur kate) (charles arthur kate) (david arthur kate) (ellen arthur kate)
 (george frank linda) (hillary frank linda) (andre nil nil) (tamara bruce suzanne) (vincent bruce suzanne)
 (wanda nil nil) (ivan george ellen) (julie george ellen) (marie george ellen) (nigel andre hillary)
 (frederick nil tamara) (zelda vincent wanda) (joshua ivan wanda)  (quentin nil nil) (robert quentin julie) 
(olivia nigel marie) (peter nigel marie) (erica nil nil) (yvette robert zelda) (diane peter erica)))
Определить функцию GENERATION-GAP, которая возвращает количество поколений между предком и потомком в генеалогическом дереве. Например,

Lisp
1
2
3
4
5
6
> (GENERATION-GAP ‘SUZANNE ‘COLIN)
1
> (GENERATION-GAP ‘FRADERICK ‘COLIN)
3
> (GENERATION-GAP ‘FRADERICK ‘LINDA)
NIL
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.10.2015, 16:44
Ответы с готовыми решениями:

что нужно использовать в данной задаче?
Вероятность брака при изготовлении некоторого изделия равна 0.02.Найти вероятность того, что среди 200 произведенных изделий будет не более...

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

Мне нужно распределить по массиву числа и выяснить сколькими способами это можно сделать но я вообще не понимаю как?
Короче, у меня есть некоторое число n, мне нужно распределить его по массиву, известно также k (значение первого элемента массива). Нужно...

5
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
22.10.2015, 18:23
Отформатируйте код. Так невозможно читать.
1
0 / 0 / 0
Регистрация: 16.10.2015
Сообщений: 24
23.10.2015, 14:05  [ТС]
nullxdth,
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
(setf family ’((colin nil nil)
 (deirdre nil nil)
 (arthur nil nil) 
(kate nil nil) 
(franknil nil) 
(linda nil nil) 
(suzanne colin deirdre)
 (bruce arthur kate)
 (charles arthur kate) 
(david arthur kate)
 (ellen arthur kate)
 (george frank linda) 
(hillary frank linda)
 (andre nil nil) 
(tamara bruce suzanne)
 (vincent bruce suzanne)
 (wanda nil nil)
 (ivan george ellen)
 (julie george ellen) 
(marie george ellen) 
(nigel andre hillary)
 (frederick nil tamara)
 (zelda vincent wanda) 
(joshua ivan wanda) quentin nil nil) 
(robert quentin julie)
 (olivia nigel marie)
 (peter nigel marie) 
(erica nil nil) 
(yvette robert zelda)
 (diane peter erica)))
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
23.10.2015, 14:34
Ginraf, напишите сначала функции
father person family => person or nil
mother person family => person or nil
Функции обозначены жирным, потом указаны аргументы и значения.

Потом пишите вашу функцию
generation-gap ancestor descendant => integer or nil
Она очень простая. Рекурсивная идея: если вы знаете промежуток n между А и Б, то промежуток между А и детьми Б равен n + 1.

Если ancestor и descendant — одно лицо, возвращаем 0. В противном случае рассматриваем родителей descendant. Если они оба не указаны (nil), придётся вернуть nil. Иначе вычисляем наименьший generation-gap от ancestor до имеющихся родителей, и если он не будет nil, прибавляем к нему 1.

Вперёд!
1
0 / 0 / 0
Регистрация: 16.10.2015
Сообщений: 24
23.10.2015, 15:53  [ТС]
helter,
С первым примером работает, а со вторым - нет.
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
(setf family '((colin nil nil)
               (deirdre nil nil)
               (arthur nil nil)
               (kate nil nil)
               (frank nil nil)
               (linda nil nil)
               (suzanne colin deirdre)
               (bruce arthur kate)
               (charles arthur kate)
               (david arthur kate)
               (ellen arthur kate)
               (george frank linda)
               (hillary frank linda)
               (andre nil nil)
               (tamara bruce suzanne)
               (vincent bruce suzanne)
               (wanda nil nil)
               (ivan george ellen)
               (julie george ellen)
               (marie george ellen)
               (nigel andre hillary)
               (frederick nil tamara)
               (zelda vincent wanda)
               (joshua ivan wanda)
               (quentin nil nil)
               (robert quentin julie)
               (olivia nigel marie)
               (peter nigel marie)
               (erica nil nil)
               (yvette robert zelda)
               (diane peter erica)))
 
(defun father (name)
  (second (assoc name family)))
 
(defun mother (name)
  (third (assoc name family)))
 
(defun parents (name)
  (remove-if #'null (rest (assoc name family))))
;   (remove-if #'null (list (father name) (mother name))))
 
(defun children (name)
  (and name
       (mapcar
         #'first
         (remove-if-not
           #'(lambda (row) (member name (rest row)))
           family))))
 
(defun siblings (name)
  (remove name (union (children (father name))
                      (children (mother name)))))
 
(defun mapunion (func x)
  (reduce #'union (mapcar func x)))
 
(defun grandparents (name)
  (mapunion #'parents (parents name)))
 
(defun cousins (name)
  (mapunion #'children (mapunion #'siblings (parents name))))
 
(defun descended-from (succ pred)
  (let ((both-parents (parents succ))
        (dad (father succ))
        (mom (mother succ)))
    (cond ((null succ) nil)
          ((member pred both-parents) t)
          (t (or (descended-from dad pred)
                 (descended-from mom pred))))))
 
(defun ancestors (name)
;  (declare (notinline ancestors))
  (let ((both-parents (parents name))
        (dad (father name))
        (mom (mother name)))
    (cond ((null name) nil)
          (t (union both-parents (union (ancestors dad)
                                        (ancestors mom)))))))
 
(defun generation-gap (person ancestor)
  (let* ((both-parents (parents person))
         (dad (father person))
         (mom (mother person))
         (person-ancestors (ancestors person))
         (dad-ancestors (ancestors dad))
         (mom-ancestors (ancestors mom)))
    (cond ((null person) nil)
          ((not (member ancestor person-ancestors)) nil)
          ((member ancestor both-parents) 1)
          ((and (member ancestor dad-ancestors)
                (member ancestor mom-ancestors))
           (min (+ 1 (generation-gap dad ancestor))
                (+ 1 (generation-gap mom ancestor))))
          ((member ancestor dad-ancestors)
           (+ 1 (generation-gap dad ancestor)))
          (t (+ 1 (generation-gap mom ancestor))))))
 
(let ((parta1 '(father 'suzanne))
      (parta2 '(mother 'suzanne))
      (parta3 '(parents 'suzanne))
      (parta4 '(parents 'frederick))
      (parta5 '(children 'arthur))
      (partb1 '(siblings 'bruce))
      (partb2 '(siblings 'zelda))
      (partc1 '(mapunion #'rest '((1 a b c)(2 e c j)(3 f a b c d))))
      (partd1 '(grandparents 'suzanne))
      (partd2 '(grandparents 'frederick))
      (partd3 '(grandparents 'yvette))
      (parte1 '(cousins 'julie))
      (partf1 '(descended-from 'tamara 'arthur))
      (partf2 '(descended-from 'tamara 'linda))
      (partg1 '(ancestors 'marie))
      (parth1 '(generation-gap 'suzanne 'colin))
      (parth2 '(generation-gap 'frederick 'colin))
      (parth3 '(generation-gap 'frederick 'linda))
      (parti1 '(descended-from 'robert 'deirdre))
      (parti2 '(ancestors 'yvette))
      (parti3 '(generation-gap 'olivia 'frank))
      (parti4 '(cousins 'peter))
      (parti5 '(grandparents 'olivia)))
  (format t "~s = ~s~%" parta1 (eval parta1))
  (format t "~s = ~s~%" parta2 (eval parta2))
  (format t "~s = ~s~%" parta3 (eval parta3))
  (format t "~s = ~s~%" parta4 (eval parta4))
  (format t "~s = ~s~%" parta5 (eval parta5))
  (format t "~s = ~s~%" partb1 (eval partb1))
  (format t "~s = ~s~%" partb2 (eval partb2))
  (format t "~s = ~s~%" partc1 (eval partc1))
  (format t "~s = ~s~%" partd1 (eval partd1))
  (format t "~s = ~s~%" partd2 (eval partd2))
  (format t "~s = ~s~%" partd3 (eval partd3))
  (format t "~s = ~s~%" parte1 (eval parte1))
  (format t "~s = ~s~%" partf1 (eval partf1))
  (format t "~s = ~s~%" partf2 (eval partf2))
  (format t "~s = ~s~%" partg1 (eval partg1))
  (format t "~s = ~s~%" parth1 (eval parth1))
  (format t "~s = ~s~%" parth2 (eval parth2))
  (format t "~s = ~s~%" parth3 (eval parth3))
  (format t "~s = ~s~%" parti1 (eval parti1))
  (format t "~s = ~s~%" parti2 (eval parti2))
  (format t "~s = ~s~%" parti3 (eval parti3))
  (format t "~s = ~s~%" parti4 (eval parti4))
  (format t "~s = ~s~%" parti5 (eval parti5)))
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
23.10.2015, 20:26
Алгоритм потому что кривой. Я вам даю ценные указания, а вы вываливаете кучу кода, написанного в разное время всеми вашими друзьями и знакомыми. Зачем вы вычисляете предков и предков родителей? Я говорил вам вычислять всех предков? Если вы интуитивно не понимаете, как вычислять разницу поколений (хотя мне неясно, как это можно не понимать), перечитайте ещё и ещё раз то, что я вам написал. Потом сделайте так же на лиспе. Уточнение: действительно, удобно возвращать nil, если один из аргументов есть nil. И вам не нужны все эти тонны кода, кроме функций father и mother, которые к тому же написаны плохо.

Я не буду вникать в вашу функцию и почему она не работает, потому что алгоритм, как было сказано, кривой. Но проверьте на опечатки ещё разок, у вас их много. К тому же сначала у вас была одна семья, потом — другая; может, в программе они путаются.

Но я дам вам ценные советы по вашему коду.

Во-первых: переменные объявляются. Повторите несколько раз: переменные — объявляются. Если вам нужна глобальная величина, которая не обязательно будет меняться, объявите её с помощью defparameter.

Далее, глобальной переменной сделайте *ушки*. Все так делают. Если вы фанат Дага Хойта, не делайте. Если нет — сделайте.

Далее, зачем хардкодить внешнюю глобальную переменную внутрь функций. Если ваша программа преимущественно работает с одной семьёй, и вам лень её каждый раз передавать аргументом, заведите-таки глобальную *family* и делайте опциональный аргумент. Например:
Lisp
1
2
(defun father (person &optional (family *family*))
  (second (assoc person family)))
И да, у меня всё работает.

Добавлено через 3 минуты
Хотя почему я решил, что разные семьи, одна вроде. Но всё равно проверьте на опечатки. fraderick, например, это что?
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.10.2015, 20:26
Помогаю со студенческими работами здесь

Ребята, задача по паскалю, нужно сдать до завтра, а эту тему я пропустил:( буду благодарен
Выведите на экран таблицу значений функции y=ax для х, изменяющегося от a до b с шагом h.

Как в VC++2008 использовать Framewok 2.0 или не использовать вообще??
интересует консольное приложение - по умолчанию .Net3.5, и поменять нельзя, бо соответствующий ListBox.Enable = False

вообще не понимаю строк
. Дана строка символов S. Известно, что символ s1 отличен от восклицательного знака и что среди s2, s3, … есть по крайней мере один...

Ребята, объясните пожалуйста эту рекурсию!
Ребята, ну хоть убейся не могу понять эту рекурсивную фунцию для задачи с Ханойской башней! Всё работает отлично, но вот как! Кто может,...

Как использовать #undef или вообще не использовать
Посоветуйте какую лучше применить концепцию. Хочу сделать в проекте унифицированные сообщения об ошибках в едином стиле. Чтобы они...


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

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

Новые блоги и статьи
Как писать чистый, тестируемый и качественный код на Python
py-thonny 12.07.2025
Помню свой первый проект на Python. Работал тогда быстро, грязно, лишь бы работало. Код был похож на запутанный клубок - переменные по одной букве, функции на 200 строк, комментарии отсутствовали как. . .
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru