IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на рекурсию..., ---
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


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

Сообщение отредактировано: Димас -


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


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

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

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


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


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


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


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

Сообщение отредактировано: Димас -


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 5:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name