Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
1

Создать отношение, реализующее функцию M(n,k)

30.04.2010, 20:43. Показов 2226. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот опять зашёл в тупик Такая задача: Создать отношение, реализующее функцию M(n,k)
так что M(n,k)=0 при n,k<0, M(0,0)=1.
M(n,k)=k*M(n-1,k)+k*M(n-1,k-1).

Вот что-то не получается раскрутить эту функцию
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2010, 20:43
Ответы с готовыми решениями:

Создать отношение, реализующее функцию SF(n)
Создать отношение, реализующее функцию SF(n) для вычисления субфакториала от n, определяемого...

Создать отношение, реализующее функцию S(n)
Никак не могу осилить свою курсовую...если можно,помогите пожалуйста....вот задание Пусть S(m) –...

Создать отношение, реализующее умножение двух матриц
Создать отношение, реализующее умножение двух матриц. В качестве примера привести результат...

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

17
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
30.04.2010, 20:53 2
Prolog
1
2
3
m(N,K,0):-N<0;K<0.
m(0,0,1):-!.
m(N,K,Ans):-N1 is N-1, m(N1,K,M1), K1 is K-1, m(N1,K1,M2),Ans is K*M1+K*M2
1
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
20.05.2010, 19:28  [ТС] 3
Хм, Что то не получается заставить её работать нормально(
0
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
23.05.2010, 20:34  [ТС] 4
вот, получилось
Prolog
1
2
3
m(N,K,0):-N<0,!;K<0,!.
m(0,0,1):-!.
m(N,K,Ans):-N1 is N-1, m(N1,K,M1), K1 is K-1, m(N1,K1,M2), Ans is M1*K+K*M2.
вроде всё хорошо, но в задании написано высчитать m(1000,500).
На что выдаёт ошибку переполнения стека, как быть?(
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
23.05.2010, 22:47 5
Я даже дождаться этого сообщения не смогла.
Если SWI Prolog, то там можно задавать размеры стека через Settings->Stack sizes
0
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
24.05.2010, 20:19  [ТС] 6
Увеличение размера стека не помогло. Препод сказал что нужно самому что нить придумать что бы сделать m(1000,500). Но у меня что то даже мыслей нет по этому поводу. Да и почему то m(6,2) считает а m(2,6) уже не считает, как доработать?. Но самая главная проблема это со стеком. В каком направлении хоть мыслить, что б уместить столь огромное число.
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
24.05.2010, 20:28 7
Что сделать для ускорения пока не знаю. А вот m(2,6) считается правильно, там действительно 0.
0
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
24.05.2010, 20:43  [ТС] 8
ну тут скорее дело не в ускорении, а в том как хранить такое огромное число. ведь при m(10,5) уже
5103000.
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
24.05.2010, 20:49 9
Нет, дело не в этом, SWI Prolog с огромными числами может работать.
0
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
06.06.2010, 16:00  [ТС] 10
m(4,1)
k m1 k m2
1*1 + 1*0
____________
m(4,2)
k m1 k m2
1*1 + 1*0
2*6 + 2*1
____________
m(4,3)
k m1 k m2
1*1 + 1*0
2*6 + 2*1
3*6 + 3*6
____________
m(4,4)
k m1 k m2
1*0 + 1*1
2*0 + 2*1
3*0 + 3*2
4*0 + 4*6
____________
m(5,1)
k m1 k m2
1*1 + 1*0
_____________
m(5,2)
k m1 k m2
1*1 + 1*0
2*14 + 2*1
_____________
m(5,3)
k m1 k m2
1*1 + 1*0
2*6 + 2*1
3*36 +3*14
______________
m(5,4)
k m1 k m2
1*1 + 1*0
2*2 + 2*1
3*6 + 3*6
4*24 + 3*36
_______________
m(5,5)
k m1 k m2
1*0 + 1*1
2*0 + 2*1
3*0 + 3*2
4*0 + 4*6
5*0 + 5*24
__________________
******************************
Собственно вот так формируется ответ при m(n,k).
Можно ли при думать такую формулу, которая в зависимости от n и k формировала такой же ответ какой приводится выше, но только без рекурсии?
Читал про Вывод рекуррентной формулы, Но там надо знать закономерность в формировании ряда, а тут я что то не могу проследить закономерность. Может кто то поможет с формулой, или хоть подскажет закономерность.
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
10.06.2010, 00:27 11
Насколько у меня получилось, то если n<k, то результат 0.
Если n=k, то результат n!
Если n>k, то результат (сумма всех чисел от 1 до k)*k!=k*(k+1)*k!/2

Добавлено через 4 минуты
Хотя нет, ошиблась
0
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
10.06.2010, 00:34  [ТС] 12
ну то что, Если n=k, то результат n! и если m(N,1) то 1.
а вот если если n>k, тут не понимаю как.

Добавлено через 4 минуты
результат (сумма всех чисел от 1 до k)*k!=k*(k+1)*k!/2
это выполняется при k=n-1.
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
10.06.2010, 01:11 13
Не, вроде тут формулы никакой нету. Я даже не знаю как делать. Там проблема в том, что одно и то же значение по несколько раз высчитывается. Это решается динамическим программированием, но на прологе же нет обращения к элементу по индексу, это всеравно будет очень медленно.

Добавлено через 5 минут
Неужели препод не может подсказать или поменять задание?
0
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 9
10.06.2010, 13:21 14
Препод молчит и улыбается...
У меня тоже на подобии задание M(n,k)=M(n-1,k)+n*M(n-1,k-1).
Было еще 3е подобное, но к нему формулу подобрали и посчитали ответ где-то знаков 50-70
Ну вот с эти 2мя оставшимися вообще ничего сделать не можем...

Добавлено через 3 часа 49 минут
хотя там формула тоже неверная и ответ неправильный, но прокатила...
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
10.06.2010, 14:04 15
Сделала, надо использовать динамическое программирование, только тут не в массиве промежуточные результаты хранятся, а в базе данных.
Prolog
1
2
3
4
m(N,K,M):-retract(b(N,K,M)),!,assert(b(N,K,M)).
m(N,K,0):-N<0,!;K<0,!.
m(0,0,1):-!.
m(N,K,Ans):-N1 is N-1, m(N1,K,M1), K1 is K-1, m(N1,K1,M2),Ans is K*M1+K*M2, assert(b(N,K,Ans)).
m(1000,500) у меня считает секунд 5. Только вот мне первая строчка не нравиться, глупо сначала удалять из базы элемент, а потом его снова возвращать, но на просто b(N,K,M) выдается ошибка, что такого предиката нет.
Deleten, я думаю, что Вы сможете написать аналогично.

Добавлено через 10 минут
С изъятием элемента из базы вопрос решился
Prolog
1
2
3
4
5
6
m(N,K,M):-b(N,K,M),!.
m(N,K,0):-N<0,!;K<0,!.
m(N,K,Ans):-N1 is N-1, m(N1,K,M1), K1 is K-1,
    m(N1,K1,M2),Ans is K*M1+K*M2, assert(b(N,K,Ans)).
 
all(N,K,M):-assert(b(0,0,1)),m(N,K,M).
И считается больше 5 секунд, это просто до этого были запущены не такие огромные тесты и база частично заполнилась. А если сразу с all(1000,500,M) начинать, то где-то полминуты наверно.
2
4 / 4 / 1
Регистрация: 27.03.2010
Сообщений: 20
10.06.2010, 20:15  [ТС] 16
Нет слов, одни эмоции ^_^ Спасибо наиогромнейшее! Даже не знаю как и благодарить.
С базами не приходилось сталкиваться, поэтому некоторые моменты пока не понятны.
на сколько я понял:
Prolog
1
2
3
4
5
6
m(N,K,M):-b(N,K,M),!. - тут формируем b.
m(N,K,0):-N<0,!;K<0,!.
m(N,K,Ans):-N1 is N-1, m(N1,K,M1), K1 is K-1,
        m(N1,K1,M2),Ans is K*M1+K*M2, assert(b(N,K,Ans)). - заносим b в базу.
 
all(N,K,M):-assert(b(0,0,1)),m(N,K,M). - а это не понятно.
или другими словами как это работает =)
0
2505 / 1480 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
10.06.2010, 21:00 17
После assert(b(1,2,3)) будет все то же самое, как если бы я изначально прописала b(1,2,3) в программе.
Поскольку в данной программе рекурсия устроенна так, что значение функции M при одной и той же паре параметров будет запрашиваться несколько раз, то это значение надо сохранять. Поэтому первым делом проверяется не было ли оно уже вычислено m(N,K,M):-b(N,K,M),!. Если же оно не было еще вычислено, то делаем это и заносим в базу assert(b(N,K,Ans)).

all(N,K,M):-assert(b(0,0,1)),m(N,K,M). Это нужно только потому, что если бы у нас еще не было занесено в базу ни одного факта b, то при первой же попытке выполнить правило m(N,K,M):-b(N,K,M),!. выдавалась бы ошибка, что предиката b не существует. Поэтому мы сначала заносим один факт, и только потом вызываем наш главный предикат вычисления функции.
2
maxbestua
25.10.2010, 22:19 18
поставили задание решить вот такую задачу.... Может кто поможет. Заранее благодарен!!!!
25.10.2010, 22:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2010, 22:19
Помогаю со студенческими работами здесь

Создать в среде MSVS C + + консольное приложение , реализующее веб -службу с использованием библиотеки gSOAP
Если можно - сделайте в коде комменты к каждой строке, пожалуйста, с подробным объяснением а-ля для...

Создать функцию для вычисления величин. Создать программу которая использует данную функцию
Создать функцию для вычисления величин. Создать программу которая использует данную функцию. ...

Определить функцию, вычисляющую отношение факториала
Граждане! Определить функцию, вычисляющую отношение факториала

Создать отношение инверсии
Создать отношение которое по порядку и количеству инверсий определяет перестановку в виде списка...


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

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