Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на рекурсию...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Димас
Добрый день уважаемые форумцы... есть задача:
Написать рекурсивно функцию для вычисления: 1.) Сумы цифр натурального числа 2.) Количество цифр натурального числа
Я вообще двоюшник blink.gif так что не судите строго smile.gif
написал я так:


Program ex657;
uses crt;

var num,sum,kol:integer;

{--------------------------FUNCTION------------------------------------}

function cout_sum(var n:integer;var s:integer;var k:integer):boolean;
var mo:integer;
pr:boolean;
begin
mo:=n mod 10;
n:=n div 10;
s:=s+mo;
inc(k); {функция типа k:=k+1;}
if n<>0 then begin pr:=cout_sum(n,s,k); end else cout_sum:=false;
end;

{--------------------------END FUNCTION---------------------------------}

{---main program---}
begin
clrscr;
writeln('Введите число=');
readln(num);
write('Для числа=',num);
cout_sum(num,sum,kol);
writeln(' Сума=',sum,' Количество=',kol);
readkey;



Преподаватель сказал что это вообще не рекурсия и не правильно то что я написал... mad.gif хотя задача то работает...
общем надо бы как то переделать но как не подскажите? blum.gif Пожалуйста....
volvo
Цитата
общем надо бы как то переделать но как
Хотя бы вот так (для нахождения суммы цифр числа, количество цифр находится аналогично - попробуй сделать это сам):
function count_sum(n: integer): integer;
begin
if n = 0 then count_sum := 0
else count_sum := (n mod 10) + count_sum(n div 10);
end;

Димас
Цитата(volvo @ 22.02.2007 19:16) *

количество цифр находится аналогично - попробуй сделать это сам

Пробовал,пробовал и нифинта не понял... и как вижу сам не сделаю((( как сделать рекурсивную функцию для вычисления количества цифр((((
вообще я загнал всё в цыкл и работает на ура и нах мне эта рекурсия... но препод не приймет задачку, потому надо через долбаную рекурсию mad.gif как написать это в рекурсии? smile.gif smile.gif
Lapp
Цитата(Димас @ 22.02.2007 23:08) *

и как вижу сам не сделаю((( как сделать рекурсивную функцию для вычисления количества цифр((((
....
надо через долбаную рекурсию mad.gif как написать это в рекурсии? smile.gif smile.gif

Димас, не падай духом! Рекурсия - это просто. Даже проще, чем циклы smile.gif
Допустим, ты большой начальник (хотя и не самый).
Тебе приходит бумага: сосчитать количество цифр в числе (число на полстраницы).
Тебе самому считать лень - это дело подчиненных. Но, поскольку ты хочешь все же вложить немного своего труда, ты стираешь одну цифру. Оставшееся число ты отсылаешь подчиненному. Когда он вернет тебе бумагу, ты прибавишь к его результату 1 (это ты умеешь smile.gif) и отрапортуешь о сделанной работе.
Подчиненный тоже начальник - поменьше, чем ты, но достаточно большой..
Он поступает точно так же как ты: стирает одну циферку и отсылает бумагу подчиненному, который, в свою очередь, тоже немаленький начальник...
И так далее.
В конце концов один из этой цепочки начальников получает пустую бумагу: все цифры уже стерты по одной предыдущими начальниками. Он решает, что это работа вполне посильная для него, и не стоит беспокоить подчиненных. Пишет свою резолюцию: "0 цифр" - и возвращает бумагу обратно.
Теперь бумага поднимается вверх. И на каждом этапе число увеличивается на единицу.
Что будет в результате?
Думаю, ты догадался.. smile.gif

Делаешь функцию, например CountDigs(M:integer):integer;
Она смотрит: если М равно нулю, то значение функции сделать нулем и выйти.
Если не ноль - то снова вызвать ту же самую функцию, но не от М, а от M div 10 (стирание цифры), прибавить к ней 1 и выйти с этим результатом.

Теперь сможешь сделать? Пиши, что непонятно.

Добавлено через 6 мин.
mamont001, ты в самом деле думаешь, что типа помог? что человек, не сумевший разобраться в нескольких строчках, написанных volvo, сможет отыскать нужное место в твоем юните и изменить его под себя?.. да еще и в неправильной кодировке..
Димас
Lapp, так-с сейчас попробую разобратся smile.gif
Димас
Цитата(Lapp @ 23.02.2007 7:39) *

делаешь функцию, например CountDigs(M:integer):integer;
Она смотрит: если М равно нулю, то значение функции сделать нулем и выйти.
Если не ноль - то снова вызвать ту же самую функцию, но не от М, а от M div 10 (стирание цифры), прибавить к ней 1 и выйти с этим результатом.

начал писать так:
 
Program blabla;

uses crt;
{-----------SUMA---------------}
function suma(n:integer):integer;

begin
if n = 0 then suma:=0
else suma:=(n mod 10)+suma(n div 10);
end;
{-----------end SUMA------------}

{---------KOLICHESTVO-----------}
function kol(n:integer):integer;
begin
if n = 0 then kol:=0
else kol:=kol(n div 10)+1;
end;
{------END KOLICHESTVO----------}


{-------MAIN PROGRAM-----------}
var a:integer;
Begin
clrscr;
writeln('Vvedite naturalnoe chislo');
readln(a);
writeln('Suma=',suma(a),' Kol=',kol(a));
readkey;
end.



О уже работает!!! blink.gif благодарю за помощь!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.