IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задачка на рекурсию!, Что я не правильно делаю?
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


Условие: Множество S, состоящее из n элементов, разбивается на k непустых подмножеств. Число таких подмножеств по рекурсивной формуле
Изображение
Прикрепленное изображение
Составить рекурсивный алгоритм и написать программу, вычисляющую Pk(n).
Вот я тут написал чуток, но что-то она не работает=(( не понимаю... Помогите плиз!
program _6_8;    
var
S,k,n : integer;
function P(k,n:integer):integer;
var i:integer;
begin s:=0;
for i:=1 to k do begin
if (i=n) and (i=1) then P:=1 else
if i>n then P:=0 else
end;
S:=S+P(i,n-i)
end;
begin
writeln('vvedite k,n');
read(k,n);
P(k,n);
write(S);
end.


Добавлено через 2 мин.
кстати для проверки можно взять k=2 и n=5, должно получиться 2! а мну ничего не получается, кстати когда в универе делал 0 получался, щас ваще ошибку 202 выдает... по памяти писал... может что-то упустил...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Ты много чего делаешь неправильно.

Во-первых, ты почему-то перепутал i и k.
Во-вторых, базовые значения у тебя были заданы не там - они должны определяться непосредственно при входе в функцию. Ты просто должен описывать ТО, что ты сам стал бы делать при вычислении по этой формуле.

Вот смотри: тебе заданы k и n. Что ты делаешь в первую очередь? В первую очередь ты должен посмотреть, не попадают ли данные k и n в базовые случаи (k=n, n=1, k>n). Если попадают - просто возвращаешь нужное значение. Если нет - тогда считаешь по данной формуле. Но, будь добр, не подменяй одни числа другими.. Сказано i - значит, ставь i. Почему ты его стал заменять на k?

Дальше, ты забываешь присвоить значение функции (в данном случае s), после вычисления формулы. Соответственно, выводить на печать нужно не s, а P.

И наконец, переменную s необходимо (!) описать внутри функции, а не глобально. Иначе ее значения затираются в процессе вызова функции в цикле. Это одно из основных требований при рекурсивных вычислениях.

Короче, вот так:
program _6_8;
var
k,n : integer;

function P(k,n:integer):integer;
var
i,s:integer;
begin
if (k=n)or(k=1) then P:=1
else if k>n then P:=0
else begin
s:=0;
for i:=1 to k do s:=s+P(i,n-k);
P:=s
end
end;

begin
writeln('vvedite k,n');
read(k,n);
WriteLn(P(k,n))
end.

А ошибка 202 - это переполнение стека. Поскольку базовые значения у тебя стояли в неправильных местах (или из-за других ошибок), код зацикливался, поскольку никогда не выходил на базовые значения. Вообще, при написании рекурсивных процедур это очень частая ошибка.

Другие замечания:
- учись правильно форматировать, это сильно помогает (используй этот код, как пример);
- учи английский, без него в программировании тяжело (это ответ на другую твою тему).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской

Репутация: -  0  +


За спасибо за помощь, в принципе когда я делал в аудитории у меня было что-то похожее, потом пришел домой и все перемешалось=))

"Во-первых, ты почему-то перепутал i и k."

не поверишь, мне так препод сказала, сначало у меня было k

"Соответственно, выводить на печать нужно не s, а P."

Это я ошибся, я потом переписал на P...



Сообщение отредактировано: Akella -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Akella @ 15.11.2008 6:28) *
не поверишь, мне так препод сказала, сначало у меня было k
Не видя конкретно того, что у тебя было, и не слыша того, что она сказала, я не стану говорить, что она ошиблась. Может, она имела в видо, что на в сумме на месте k стоит i, а может, еще что. Верить тебе - верю, но вопрос, поняли ли вы друг друга..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 16:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name