Доброго времени суток! Если кто может помогите с задачкой...:
Написать рекурсивную процедуру, которая считывает вводимые с клавиатуры числа до тех пор, пока не будет обнаружен 0.Затем введенные числа распечатываются в обратном порядке.0 Не печатать.
спасибо заранее!
spill
20.03.2008 16:22
Procedure ReadInt; Var X: Integer; Begin ReadLn (X); If X <> 0 Then Begin ReadInt; WriteLn (X); End; End;
Гость
21.03.2008 1:27
А можно для "тупых" с телом программы ?
klem4
21.03.2008 1:32
begin ReadInt end.
vRs
21.03.2008 16:28
В люом случае, это ведь не рекурсия...
volvo
21.03.2008 16:45
Цитата
В люом случае, это ведь не рекурсия...
Ну да, конечно... Только ReadInt сама себя вызывает, и все... Определение рекурсии выучи, потом придешь дальнейшие вопросы задавать.
Michael_Rybak
21.03.2008 18:10
Цитата
В люом случае, это ведь не рекурсия...
Действительно. Это не рекурсия. Это рекурсивная процедура.
sintanial
22.03.2008 0:07
Не хотел создавать новую тему, так что спрошу тута. Вот задание: Написать программу которая подсчитывает сумму и количество элементов в массиве до первого отрицательного элемента, и сделать это надо с помощью рекурсии . Не рекурсивным методом решить эту задачи не составляет и малейшего труда, а вот как рекурсией не понятно. Вот минут 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
22.03.2008 0:16
Для начала вынеси собственно решение в отдельную процедуру, и тогда уже будем смотреть дальше...
sintanial
22.03.2008 0:40
ну воть Забыл сказать, что нельзя использовать циклы. можно только в вводе и выводе массива и все =)
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
22.03.2008 1:47
Вот написал но оно не пашет =). Пишет ошибку типа выход за границы изменения индекса =) Как исправить ?
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
22.03.2008 1:58
Цитата
Забыл сказать, что нельзя использовать циклы
В принципе, рекурсия и будет заменять цикл...
Смотри... Во-первых, твоя процедура может быть описана вот так:
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
22.03.2008 2:01
Спасибо огромное, щас буду разбираться что да как =)
sintanial
22.03.2008 2:22
Уже появились вопросы =) 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
22.03.2008 2:55
Цитата(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
22.03.2008 3:01
Да не выбивает оно ничего (если ты используешь 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
22.03.2008 3:22
Ясно =). Спасибо огромное. А на счет ABC - просто я учусь в РГУ(ростовский гос-во универ ) на мехмате и так как там глава кафедры программирование Михалкович (сделал PascalABC) то всем приходится работать на нем =), щаз попробую запустить в PascalABC.net , может заработает =) ! З.ы. У мя наверно ж поэтому и не работали многие программы которые ты мне помогал делать: с некоторыми модулями или еще с чем нить то что не поддерживает АBC =)
volvo
22.03.2008 3:22
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.