Помощь - Поиск - Пользователи - Календарь
Полная версия: Рекурсия
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Amro
Люди объясните пожалуйста что такое рекурсия.... Мне надо программку написать использую рекурсивную функцию, а почитать про саму рекурсию у меня нету ничего.... В общем вот условие:
 "Написать программу, определяющую из скольки цифр состоит данное натуральное число"
Вот как я её написал, но по-моему это не рекурсия!! Объясните пожалуйста как её переделать(если она не правильна)!!!.............
Код

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
Всё!!! что такое рекурсия я врубился!!! Но програмка настолько простая, что я не знаю, что из одной ф-ции перекинуть в другую!! Подскажите пожлста smile.gif.....
trminator
Может быть неправильно, но...
Код

function count(n: integer):integer;
begin
   if n<10 then count:=1
   else count:=1+count(n div 10)
end;
Amro
Нет это чего-то не то!!! В общем в проге которуя я написал выше нужно из ф-ции
KOL перенести какие-то вычисления в другую ф-цию, т.е чтобы из одной функции (KOL)  вызывалась другая ф-ция, но как я уже говорил, что не могу ничего из ф-ции KOL выкинуть, не писать же лишнее в программе(в другой ф-ции), ведь она так то работает правильно и всё вычисляет, а самой рекурсии в ней нет....
А что делать я не знаю ???
trminator
А чего не нравится-то? Она рекурсивная, да еще и работает smile.gif

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

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

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

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

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

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.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.