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

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

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

 
 Ответить  Открыть новую тему 
> Рекурсия, рекурсиваная процедура....
Миклашевский Денис
сообщение 20.03.2008 9:24
Сообщение #1


Гость






Доброго времени суток! Если кто может помогите с задачкой...:


Написать рекурсивную процедуру, которая считывает вводимые с клавиатуры числа до тех пор, пока не будет обнаружен 0.Затем введенные числа распечатываются в обратном порядке.0 Не печатать.


спасибо заранее!
 К началу страницы 
+ Ответить 
spill
сообщение 20.03.2008 12:22
Сообщение #2


Пионер
**

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

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



Procedure ReadInt;
Var
X: Integer;
Begin
ReadLn (X);
If X <> 0
Then Begin
ReadInt;
WriteLn (X);
End;
End;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 20.03.2008 21:27
Сообщение #3


Гость






А можно для "тупых" с телом программы smile.gif?
 К началу страницы 
+ Ответить 
klem4
сообщение 20.03.2008 21:32
Сообщение #4


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


begin ReadInt end. 


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
vRs
сообщение 21.03.2008 12:28
Сообщение #5





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

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


В люом случае, это ведь не рекурсия...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.03.2008 12:45
Сообщение #6


Гость






Цитата
В люом случае, это ведь не рекурсия...
Ну да, конечно... Только ReadInt сама себя вызывает, и все... Определение рекурсии выучи, потом придешь дальнейшие вопросы задавать.
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 21.03.2008 14:10
Сообщение #7


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Цитата
В люом случае, это ведь не рекурсия...


Действительно. Это не рекурсия. Это рекурсивная процедура.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sintanial
сообщение 21.03.2008 20:07
Сообщение #8


Пионер
**

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

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


Не хотел создавать новую тему, так что спрошу тута.
Вот задание:
Написать программу которая подсчитывает сумму и количество элементов в массиве до первого отрицательного элемента, и сделать это надо с помощью рекурсии . Не рекурсивным методом решить эту задачи не составляет и малейшего труда, а вот как рекурсией не понятно. Вот минут 15-20 сидел в поисковике но так и не нашел не че подходящего, связанного с моей задачей.

Подскажите пожалуйста что нужно делать =)


Вот задача без рекурсии =)

type vect=array[1..100] of real;
procedure Mat(const a:vect; var k:real);
var n,i:integer;
begin
i:=1;
while a[i]>0 do
begin
k:=k+a[i];
inc(i);
end;
end;

var a:vect; n,i:integer; k:real;
begin
read(n);
for i:=1 to n do
read(a[i]);
mat(a,k);
writeln(k,' ',i-1);
end.



З.ы. Для начало сделайте подсказку, может сам смогу написать- просто пока что трудно осмыслить с рикурсией =)

Сообщение отредактировано: sintanial - 21.03.2008 20:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.03.2008 20:16
Сообщение #9


Гость






Для начала вынеси собственно решение в отдельную процедуру, и тогда уже будем смотреть дальше...
 К началу страницы 
+ Ответить 
sintanial
сообщение 21.03.2008 20:40
Сообщение #10


Пионер
**

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

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


ну воть
Забыл сказать, что нельзя использовать циклы. можно только в вводе и выводе массива и все =)

type vect=array[1..100] of real;
procedure Mat(const a:vect; var k:real);
var n,i:integer;
begin
i:=1;
while a[i]>0 do
begin
k:=k+a[i];
inc(i);
end;
end;

var a:vect; n,i:integer; k:real;
begin
read(n);
for i:=1 to n do
read(a[i]);
mat(a,k);
writeln(k,' ',i-1);
end



Сообщение отредактировано: sintanial - 21.03.2008 20:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sintanial
сообщение 21.03.2008 21:47
Сообщение #11


Пионер
**

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

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


Вот написал но оно не пашет =). Пишет ошибку типа выход за границы изменения индекса =) Как исправить ?


type vect=array[1..100] of real;

function Mat(i:integer):real;
var n:integer; a:vect; k:real;
begin
if (a[i]<0) or (n=i) then
mat:=k
else
k:=k+a[i];
mat:=mat(i+1)+k;
end;



var a:vect; n,i:integer; k:real;
begin
read(n);
for i:=1 to n do
read(a[i]);
i:=1;
k:=mat(i);
writeln(k,' ',i-1);
end.



Сообщение отредактировано: sintanial - 21.03.2008 21:49
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.03.2008 21:58
Сообщение #12


Гость






Цитата
Забыл сказать, что нельзя использовать циклы
В принципе, рекурсия и будет заменять цикл...

Смотри... Во-первых, твоя процедура может быть описана вот так:
procedure Mat(const a: array of real; var k:real);

, что даст тебе возможность более гибко работать с массивами. Во-вторых, поскольку тебе надо _и_ сумму _и_ количество, то логичнее сделать функцию:

function mat(const a: array of real; n: integer;
var sum: real): integer;
begin
if (a[0] < 0) or (n = 0) then begin { или отр. элемент, или массив закончился }
mat := 0; exit
end;

sum := sum + a[0]; { нужно считать, до границы не добрались }
mat := 1 + mat(a[1], n - 1, sum); { вот, собственно, ради чего это начиналось }
end;

type
vect = array[1 .. 100] of real;
var
a: vect;
n, i: integer; s: real;
begin
readln(n);
for i := 1 to n do
readln(a[i]);

s := 0; { <--- никогда не лишнее действие }
i := mat(a, n, s);
writeln(s:8:4, ' ', i);
end.


 К началу страницы 
+ Ответить 
sintanial
сообщение 21.03.2008 22:01
Сообщение #13


Пионер
**

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

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


Спасибо огромное, щас буду разбираться что да как =)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sintanial
сообщение 21.03.2008 22:22
Сообщение #14


Пионер
**

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

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


Уже появились вопросы =)
const a: array of real
выбивает ошибку =( пишет типа ожидался символ "[", тогда я поставил размер [1..100] и он опять выдает ошибку
Вот эту фразу не хочет читать потому как при вызове функциии вот здесь ругается mat(a[1], n - 1, sum) пишет "Нельзя приобразовать выражение типа real к выражению типа array[1..100] of real - воть так вот =(
И еще volvo наш учитель почему то не разрешает пользоваться "exit" говорит что должны учиться делать без неё так как это типа делает программиста более не опытным если ей пользуешься =(. Это не к кому конечно же тута не относится- просто мнение нашего учителя =). (хотя какой там из меня опытный программист =) ). А вот без exit я вот уже час думаю как сделать =)

З.ы. Может ошибка выбивает из за того что я работаю на Pascal ABC( нам пока на других запрещают работать ) ? а не на Turbo Pascal =)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 21.03.2008 22:55
Сообщение #15


Гуру
*****

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

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


Цитата(sintanial @ 21.03.2008 22:22) *
И еще volvo наш учитель почему то не разрешает пользоваться "exit" говорит что должны учиться делать без неё так как это типа делает программиста более не опытным если ей пользуешься =(. Это не к кому конечно же тута не относится- просто мнение нашего учителя =).
В принципе exit следует применять очень осторожно, т.к. от этого повышается вероятность допустить ошибку и код становится менее наглядным - хуже видна структура.

Смотри, что у тебя есть:

begin
if statement then begin
something 1;
exit;
end;
something 2;
end;


При этом если условие выполняется, то мы не выполняем ничего, что находится ниже, что полностью эквивалентно ветке "иначе" условного оператора, т.е. этот пример эквивалентен следующему:

begin
if statement then begin
something 1;
end else begin
something 2;
end;
end;



Сообщение отредактировано: andriano - 21.03.2008 22:56
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.03.2008 23:01
Сообщение #16


Гость






Да не выбивает оно ничего (если ты используешь TP, конечно) - я на TP7 проверял - все прекрасно работает. А вот если у тебя ABC - это надо говорить сразу. Этим поделием я не пользуюсь, и что там и как - не знаю... Можешь попробовать поменять Const на Var, если PascalABC вообще умеет работать с открытыми массивами.

Цитата
А вот без exit я вот уже час думаю как сделать
Бред какой-то несет твой преподаватель... Если б Exit и ему подобные делали программистов менее опытными, неужели ж их не вывели из состава языка? Ан нет, в любом языке присутствуют аналоги... Здесь проблема решается просто:

function mat(const a: array of real; n: integer;
var sum: real): integer;
begin
if (a[0] < 0) or (n = 0) then mat := 0
else begin
sum := sum + a[0];
mat := 1 + mat(a[1], n - 1, sum);
end;
end;

, но в другом месте потребуется наворотить еще столько же кода. Это кому-то надо?
 К началу страницы 
+ Ответить 
sintanial
сообщение 21.03.2008 23:22
Сообщение #17


Пионер
**

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

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


Ясно =). Спасибо огромное. А на счет ABC - просто я учусь в РГУ(ростовский гос-во универ ) на мехмате и так как там глава кафедры программирование Михалкович (сделал PascalABC) то всем приходится работать на нем =), щаз попробую запустить в PascalABC.net , может заработает =) !
З.ы. У мя наверно ж поэтому и не работали многие программы которые ты мне помогал делать: с некоторыми модулями или еще с чем нить то что не поддерживает АBC =)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.03.2008 23:22
Сообщение #18


Гость






PascalABC workaround:
type arrtype = array[1 .. 100] of real;
function mat(const a: arrtype; i, n: integer;
var sum: real): integer;
begin
if (i > n) or (a[i] < 0) then mat := 0
else begin
sum := sum + a[i];
mat := 1 + mat(a, i + 1, n, sum);
end;
end;

var
a: arrtype;
n, i: integer; s: real;
begin
readln(n);
for i := 1 to n do
readln(a[i]);

i := mat(a, 1, n, s);
writeln(s:8:4, ' ', i);
end.


Сообщение отредактировано: volvo - 22.03.2008 3:41
 К началу страницы 
+ Ответить 

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

 



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