Форум «Всё о Паскале» _ Задачи _ Задача на рекурсию...
Автор: Димас 22.02.2007 20:35
Добрый день уважаемые форумцы... есть задача: Написать рекурсивно функцию для вычисления: 1.) Сумы цифр натурального числа 2.) Количество цифр натурального числа Я вообще двоюшник так что не судите строго написал я так:
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;
Преподаватель сказал что это вообще не рекурсия и не правильно то что я написал... хотя задача то работает... общем надо бы как то переделать но как не подскажите? Пожалуйста....
Автор: 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)
количество цифр находится аналогично - попробуй сделать это сам
Пробовал,пробовал и нифинта не понял... и как вижу сам не сделаю((( как сделать рекурсивную функцию для вычисления количества цифр(((( вообще я загнал всё в цыкл и работает на ура и нах мне эта рекурсия... но препод не приймет задачку, потому надо через долбаную рекурсию как написать это в рекурсии?
Автор: Lapp 23.02.2007 10:39
Цитата(Димас @ 22.02.2007 23:08)
и как вижу сам не сделаю((( как сделать рекурсивную функцию для вычисления количества цифр(((( .... надо через долбаную рекурсию как написать это в рекурсии?
Димас, не падай духом! Рекурсия - это просто. Даже проще, чем циклы Допустим, ты большой начальник (хотя и не самый). Тебе приходит бумага: сосчитать количество цифр в числе (число на полстраницы). Тебе самому считать лень - это дело подчиненных. Но, поскольку ты хочешь все же вложить немного своего труда, ты стираешь одну цифру. Оставшееся число ты отсылаешь подчиненному. Когда он вернет тебе бумагу, ты прибавишь к его результату 1 (это ты умеешь ) и отрапортуешь о сделанной работе. Подчиненный тоже начальник - поменьше, чем ты, но достаточно большой.. Он поступает точно так же как ты: стирает одну циферку и отсылает бумагу подчиненному, который, в свою очередь, тоже немаленький начальник... И так далее. В конце концов один из этой цепочки начальников получает пустую бумагу: все цифры уже стерты по одной предыдущими начальниками. Он решает, что это работа вполне посильная для него, и не стоит беспокоить подчиненных. Пишет свою резолюцию: "0 цифр" - и возвращает бумагу обратно. Теперь бумага поднимается вверх. И на каждом этапе число увеличивается на единицу. Что будет в результате? Думаю, ты догадался..
Делаешь функцию, например CountDigs(M:integer):integer; Она смотрит: если М равно нулю, то значение функции сделать нулем и выйти. Если не ноль - то снова вызвать ту же самую функцию, но не от М, а от M div 10 (стирание цифры), прибавить к ней 1 и выйти с этим результатом.
Теперь сможешь сделать? Пиши, что непонятно.
Добавлено через 6 мин. mamont001, ты в самом деле думаешь, что типа помог? что человек, не сумевший разобраться в нескольких строчках, написанных volvo, сможет отыскать нужное место в твоем юните и изменить его под себя?.. да еще и в неправильной кодировке..
Автор: Димас 23.02.2007 16:23
Lapp, так-с сейчас попробую разобратся
Автор: Димас 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.