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

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

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

> Задача на рекурсию..., ---
Димас
сообщение 22.02.2007 16:35
Сообщение #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 Пожалуйста....

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


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 22.02.2007 18:16
Сообщение #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;

 К началу страницы 
+ Ответить 
Димас
сообщение 22.02.2007 23:08
Сообщение #3


Пионер
**

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

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


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

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

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


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.02.2007 6:39
Сообщение #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 
 К началу страницы 
+ Ответить 
Димас
сообщение 23.02.2007 12:23
Сообщение #5


Пионер
**

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

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


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


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

Сообщений в этой теме


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

 



- Текстовая версия 20.07.2025 15:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"