Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Рекурсия

Автор: Amro 5.01.2004 21:49

Люди объясните пожалуйста что такое рекурсия.... Мне надо программку написать использую рекурсивную функцию, а почитать про саму рекурсию у меня нету ничего.... В общем вот условие:
 "Написать программу, определяющую из скольки цифр состоит данное натуральное число"
Вот как я её написал, но по-моему это не рекурсия!! Объясните пожалуйста как её переделать(если она не правильна)!!!.............

Код

program lab6;
uses crt;
var
m:longint; q:char;
function KOL(n:longint):word;
var k:word;
 begin
 k:=0;
 if n=0 then begin k:=1; kol:=k; end;
   while (n<>0) do
     begin
     n:=n div 10;
     inc(k);
     KOL:=k;
   end;
 end;
begin
repeat
clrscr;
writeln('введите натуральное число');
readln(m);
writeln('число ',m,' состоит из ', KOL(m),' цифр');
write('Вычислить еще ?(Y/N)');
q:=ReadKey;
until not (q in ['Y','y']);
end.
???

Автор: Amro 5.01.2004 22:23

Всё!!! что такое рекурсия я врубился!!! Но програмка настолько простая, что я не знаю, что из одной ф-ции перекинуть в другую!! Подскажите пожлста smile.gif.....

Автор: trminator 5.01.2004 22:42

Может быть неправильно, но...

Код

function count(n: integer):integer;
begin
   if n<10 then count:=1
   else count:=1+count(n div 10)
end;

Автор: Amro 5.01.2004 22:51

Нет это чего-то не то!!! В общем в проге которуя я написал выше нужно из ф-ции
KOL перенести какие-то вычисления в другую ф-цию, т.е чтобы из одной функции (KOL)  вызывалась другая ф-ция, но как я уже говорил, что не могу ничего из ф-ции KOL выкинуть, не писать же лишнее в программе(в другой ф-ции), ведь она так то работает правильно и всё вычисляет, а самой рекурсии в ней нет....
А что делать я не знаю ???

Автор: trminator 5.01.2004 22:59

А чего не нравится-то? Она рекурсивная, да еще и работает smile.gif

Логика: если число меньше 10, то в нем одна цифра. Иначе в нем цифр ровно на одну больше, чем в нем же, но без последней цифры

Автор: Amro 5.01.2004 23:13

Извини не разобрался.... В общем рекурсия здесь заключается в том что ф-ция обращается сама к себе....Я правильно понял? Так конечно попрёт, но мне бы хотелось переделать свою прогу, хотя твоя самая компактная... Что можно ещё придумать?...... smile.gif

Автор: Amro 5.01.2004 23:15

Ладно всё класс!!! Для училки попрёт....

Автор: trminator 6.01.2004 0:58

Цитата
рекурсия здесь заключается в том что ф-ция обращается сама к себе

В этом суть рекурсии
Цитата
переделать свою прогу

Вот что получится, если "развернуть" рекурсию в моей функции
Код

count:=1;
while n>=10 do begin
 inc(count);
 n:=n div 10
end;

А это почти то же самое, что и у тебя

Автор: SKVOZNJAK 6.01.2004 2:04

Кстати, как там у твоей любимой учительницы, нервишки-то крепкие?  ;)

Код

program lab6;
uses crt;
var
m:longint;
q:char;

function KOL(n:longint):word;
var k,w:word;
label 1,2,3;
begin
k:=0;
if n=0 then begin
                 k:=1;
                 kol:=k;
                 goto 2;
                 end;
w:=0;
1: for k:=w to w do begin
                              n:=n div 10;  
                              inc(k);
                              inc(w);
                              if n>0 then goto 1 else goto 3;
                              end;
3: KOL:=k;
2: end;

begin
repeat
clrscr;
writeln('введите натуральное число');
readln(m);
writeln('число ',m,' состоит из ', KOL(m),' цифр'); write('Вычислить еще ?(Y/N)');
q:=ReadKey;
until not (q in ['Y','y']);
end.