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

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

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

Автор: Димас 22.02.2007 20:35

Добрый день уважаемые форумцы... есть задача:
Написать рекурсивно функцию для вычисления: 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 22.02.2007 22:16

Цитата
общем надо бы как то переделать но как
Хотя бы вот так (для нахождения суммы цифр числа, количество цифр находится аналогично - попробуй сделать это сам):
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;


Автор: Димас 23.02.2007 3:08

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

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

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

Автор: Lapp 23.02.2007 10:39

Цитата(Димас @ 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, сможет отыскать нужное место в твоем юните и изменить его под себя?.. да еще и в неправильной кодировке..

Автор: Димас 23.02.2007 16:23

Lapp, так-с сейчас попробую разобратся smile.gif

Автор: Димас 23.02.2007 20:16

Цитата(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 благодарю за помощь!