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

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

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

 
 Ответить  Открыть новую тему 
> Рекурсия, рекурсиваная процедура....
сообщение
Сообщение #1


Гость






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


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


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


Пионер
**

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

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



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

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


Гость






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


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

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

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


begin ReadInt end. 


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





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

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


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


Гость






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


Michael_Rybak
*****

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

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


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


Действительно. Это не рекурсия. Это рекурсивная процедура.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Для начала вынеси собственно решение в отдельную процедуру, и тогда уже будем смотреть дальше...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.


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


Пионер
**

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

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


Спасибо огромное, щас буду разбираться что да как =)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;

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


Пионер
**

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

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


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

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

 





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