Помощь - Поиск - Пользователи - Календарь
Полная версия: Рекурсия
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Миклашевский Денис
Доброго времени суток! Если кто может помогите с задачкой...:


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


спасибо заранее!
spill

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

Гость
А можно для "тупых" с телом программы smile.gif?
klem4
begin ReadInt end. 
vRs
В люом случае, это ведь не рекурсия...
volvo
Цитата
В люом случае, это ведь не рекурсия...
Ну да, конечно... Только ReadInt сама себя вызывает, и все... Определение рекурсии выучи, потом придешь дальнейшие вопросы задавать.
Michael_Rybak
Цитата
В люом случае, это ведь не рекурсия...


Действительно. Это не рекурсия. Это рекурсивная процедура.
sintanial
Не хотел создавать новую тему, так что спрошу тута.
Вот задание:
Написать программу которая подсчитывает сумму и количество элементов в массиве до первого отрицательного элемента, и сделать это надо с помощью рекурсии . Не рекурсивным методом решить эту задачи не составляет и малейшего труда, а вот как рекурсией не понятно. Вот минут 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.



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

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
Вот написал но оно не пашет =). Пишет ошибку типа выход за границы изменения индекса =) Как исправить ?


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.

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

Смотри... Во-первых, твоя процедура может быть описана вот так:
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
Спасибо огромное, щас буду разбираться что да как =)
sintanial
Уже появились вопросы =)
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 =)
andriano
Цитата(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;

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