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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> рекурсия- расстановка знаков
Екатерина7
сообщение 22.11.2009 21:10
Сообщение #1


Новичок
*

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

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


помогите, пожалуйста, разобраться с задачей

Для заданного набора целых чисел без знака расставить между ними арифметические знаки сложения, деления, и умножения так, чтобы результат вычисления полученного арифметического выражения был минимальным. Число знаков умножения в этом выражении должно быть равным или на 2 больше, чем знаков сложения, а знаков сложения- равно или на 1 больше, чем знаков деления. В наборе должно быть не менее четырех чисел, а в полученном выражении должны присутствовать все три арифметических знака.

(умножение и деление имеют приоритет перед операциями сложения и вычитания, деление производится с остатком)



Сообщение отредактировано: Екатерина7 - 23.11.2009 18:16
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.11.2009 22:33
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


Екатерина, перенести тему в "Задачи на заказ"? Или Вы попробуете что-нибудь сделать и задать конкретные вопросы?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Екатерина7
сообщение 22.11.2009 22:54
Сообщение #3


Новичок
*

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

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


Цитата(мисс_граффити @ 22.11.2009 22:33) *

Екатерина, перенести тему в "Задачи на заказ"? Или Вы попробуете что-нибудь сделать и задать конкретные вопросы?

а сколько примерно будет стоить одна программа?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.11.2009 5:09
Сообщение #4


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

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

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


Согласия на перенос, как я понял, не поступало... Переношу в Задачи.

Екатерина7, ты можешь высказать свои соображения по поводу задач? Любые, просто, что ты думаешь. Если есть начало написания кода - еще лучше. И еще: ты работала раньше а рекурсией? Ответь, пожалуйста.

По первой задаче: при выполнении операций нужно ли соблюдать правило, что умножение и деление имеют приоритет перед сложением?

Вторая задача тоже интересная.

Ты все же определись с тем, хочешь ли ты решать сама (с помощью Форума - лично я с удовольствием включусь в обсуждение, задачи приятные), или ты хочешь заплатить. Цена нефиксирована, как договоритесь (если кто-то возьмется). Если же все же ты предпочтешь первый вариант, то я буду настаивать на разделении темы на две (правила раздела Задачи, п.6). Оставь в этой теме, скажем, первую задачу, а во второй запость вторую. И позаботься о хороших названиях (Правила Форума, п.4).



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


Гость






соображений никаких нет.. с рекурсией не работала.. все таки остановлюсь на том, чтобы заплатить.
 К началу страницы 
+ Ответить 
Гость
сообщение 23.11.2009 13:00
Сообщение #6


Гость






Цитата(Гость @ 23.11.2009 12:43) *
соображений никаких нет.. с рекурсией не работала.. все таки остановлюсь на том, чтобы заплатить.
Соображения и опыт могли бы появиться.
Ну, хозяин - барин..
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.11.2009 18:51
Сообщение #7


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

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

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


Остается открытым вопрос про приоритеты операций. Нужно его учитывать или нет? Пожалуйста, уточни. Решения отличаются довольно сильно.

Решение без приоритетов несложное. Собственно, вот оно..
const
m=10;

type
tNum= double;

var
n,Ad,Mu,Di: integer;
Arg: array[1..m]of tNum;
Oper,MinOper: array[2..m]of char;
Res,Min: tNum;
Start: boolean;


procedure Count;
var
a,Res0: tNum;
begin
if n=m then begin
if (Di>0) and ((Mu=Ad)or(Mu-Ad=2)) and ((Ad=Di)or(Ad-Di=1)) and (Start or(Res<Min)) then begin
Min:=Res;
MinOper:=Oper;
Start:=false
end
end
else begin
Res0:=Res;
a:=Arg[n];
Inc(n);

Oper[n]:='+';
Inc(Ad);
Res:=Res0+a;
Count;
Dec(Ad);

Oper[n]:='*';
Inc(Mu);
Res:=Res0*a;
Count;
Dec(Mu);

Oper[n]:='/';
Inc(Di);
Res:=Res0/a;
Count;
Dec(Di);

Dec(n)
end
end;

var
i: integer;

begin
Randomize;
for i:=1 to m do Arg[i]:=Random*2;
Start:=true;
Res:=Arg[1];
Ad:=0;
Mu:=0;
Di:=0;
n:=1;
Count;
Write(Min:10,' : ');
for i:=1 to m do begin
if i>1 then Write(' ',MinOper[i],' ');
Write(Arg[i]:5:2);
end;
WriteLn;
ReadLn
end.

Я его слишком придирчиво не проверял (не на чем, не считать же на бумажке)). Нашедшему существенную ошибку - плюс в репу)).
Катя, спрашивай, что неясно.

Его можно в принципе переделать и на приоритеты..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Екатерина7
сообщение 23.11.2009 19:02
Сообщение #8


Новичок
*

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

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


я же вроде там в скобочках дописала..
(умножение и деление имеют приоритет перед операциями сложения и вычитания, деление производится с остатком)


Добавлено через 5 мин.
еще несовсем понятно эта строчка Res,Min: tNum;
и вот это Dec(Ad);

Добавлено через 1 мин.
Dec(Ad);- это результат операции какой-то?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.11.2009 19:31
Сообщение #9


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

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

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


Цитата(Екатерина7 @ 23.11.2009 19:02) *
я же вроде там в скобочках дописала..
Извиняюсь, не заглянул наверх (лучше говорить по ходу темы)

Цитата
еще несовсем понятно эта строчка Res,Min: tNum;
и вот это Dec(Ad);
Dec(Ad);- это результат операции какой-то?
Res - это сам результат выполнения операций. В самом начале он равен первому числу, потом "накапливается" по мере выполнения.
Min - это минимальный из всех Res, то есть то, что мы ищем. Мы его обновляем по мере встечи более маленьких значений Res.

Dec(x) - это операция уменьшения x на 1, то есть эквивалентно записи: x:=x-1

Спрашивай дальше.

Если приоритет нужно учитывать, решение нужно дорабатывать. Подумай, как. Я тоже )).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Екатерина7
сообщение 23.11.2009 19:42
Сообщение #10


Новичок
*

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

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


спасибо огромное тебе!!!! подумаю над решением и вопросами..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 23.11.2009 22:09
Сообщение #11


Гость






а что такое Start?
например, Start:=false
 К началу страницы 
+ Ответить 
Unconnected
сообщение 23.11.2009 22:16
Сообщение #12


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

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


Присваивание логической переменной значения false.

Задача навскидку курса 2-3, и не знать булевых переменных? О_о

Сообщение отредактировано: Unconnected - 23.11.2009 22:16


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 24.11.2009 6:50
Сообщение #13


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

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

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


Цитата(Гость @ 23.11.2009 22:09) *
а что такое Start?
например, Start:=false
Start - логическая переменная, с помощью которой мы инициализируем Min жизненным значением, а не среднепотолочным. При самой первой встрече допустимой комбинации знаков мы заносим ее в Min (чтобы потом уточнять), а переменную Start сбрасываем в ложь.

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

Общая логика проги сохранилась. Екатерина, ты можешь приблизительно прокомментировать, что там к чему? Хотя бы сказать, где там использована рекурсия - можешь? И зачем.
Или вот такой совсем конкретный вопрос: какой цели служит массив Oper?


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


Гость






массив Oper- массив знаков. так?
 К началу страницы 
+ Ответить 
Гость
сообщение 24.11.2009 10:00
Сообщение #15


Гость






рекурсия используется в самом конце программы? честно, затрудняюсь сказать для чего она нужна.. unsure.gif
 К началу страницы 
+ Ответить 
Lapp
сообщение 24.11.2009 11:31
Сообщение #16


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

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

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


Цитата(Гость @ 24.11.2009 9:35) *
массив Oper- массив знаков. так?
Так. Вопрос был, для чего он используется.

Цитата(Гость @ 24.11.2009 10:00) *
рекурсия используется в самом конце программы? честно, затрудняюсь сказать для чего она нужна..
Нет не в конце. Посмотри внимательно, пожалуйста. В программе есть три места, где применяется рекурсия.

Катя, ты забыла пароль? Его нужно восстановить?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Екатерина7
сообщение 24.11.2009 23:02
Сообщение #17


Новичок
*

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

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


нет, спасибо, не нужно восстанавливать..

Добавлено через 1 мин.
здесь применяется:
Oper[n]:='+';
Inc(Ad);
Res:=Res0+a;
Count;
Dec(Ad);
?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 24.11.2009 23:18
Сообщение #18


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

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


Ну как бы да, применяется здесь... Т.е. процедура вызывает себя из себя же.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 25.11.2009 2:31
Сообщение #19


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

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

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


Да. Достаточно было указать на три вызова процедуры Count, которые производятся изнутри самой процедуры. Видишь их? один для +, второй для *, третий для /. Смысл слова "рекурсия" именно в этом и состоит. Как "ре-монт" - это "повторный монтаж", так и "ре-курсия" - это "повторный заход".

Дальше, сам отвечу на свой вопрос. Массив Oper (вместе с OperMin) служит одной-единственной цели: распечатать расставленные знаки в конце. Для самой функциональности, то есть для отыскания нужной комбинации знаков, он не нужен. Это я хотел от тебя услышать.

Похоже, что интереса к задаче у тебя так и не появилось. Мне начинает надоедать вытягивать из тебя по слову. Похоже, что мне это нужно больше тебя.. Когда уже в России научатся (и захотят) учиться?..

Лови решение этой задачи.
const
m=10; {размер цепочки чисел}

type
tNum= LongInt;

var
n,Ad,Mu,Di: integer;
Arg: array[1..m]of tNum;
Oper,MinOper: array[2..m]of char;
Sum,Res,Min: tNum;
Start: boolean;

procedure Count;
var
a,Sum0,Res0: tNum;
begin
if n=m then begin
if (Di>0) and ((Mu=Ad)or(Mu-Ad=2)) and ((Ad=Di)or(Ad-Di=1)) then begin
Sum:=Sum+Res;
if Start or(Sum<Min) then begin
Min:=Sum;
MinOper:=Oper;
Start:=false
end
end
end
else begin
Sum0:=Sum;
Res0:=Res;
Inc(n);
a:=Arg[n];

Oper[n]:='+';
Inc(Ad);
Sum:=Sum+Res;
Res:=a;
Count;
Sum:=Sum0;
Dec(Ad);

Oper[n]:='*';
Inc(Mu);
Res:=Res0*a;
Count;
Dec(Mu);

Oper[n]:='/';
Inc(Di);
Res:=Res0 div a;
Count;
Dec(Di);

Dec(n);
end
end;

var
i: integer;

begin
Randomize;
for i:=1 to m do Arg[i]:=Random(m)+1;
Start:=true;
Res:=Arg[1];
Sum:=0;
Ad:=0;
Mu:=0;
Di:=0;
n:=1;
Count;
Write(Min:10,' = ');
for i:=1 to m do begin
if i>1 then Write(' ',MinOper[i],' ');
Write(Arg[i]);
end;
WriteLn;
ReadLn
end.

На TP не проверял, только на FPC.
Разбирайся. Спрашивай.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Екатерина7
сообщение 25.11.2009 14:44
Сообщение #20


Новичок
*

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

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


спасибо большое!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 19.07.2025 3:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"