Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 23:05   #1
Feran
 
Регистрация: 04.04.2010
Сообщений: 8
По умолчанию Составить рекурсивную функцию, которая находит цифровой корень целого числа.

Составить рекурсивную функцию, которая находит цифровой корень целого числа. Цифровой корень находится суммой через сумму цифр числа к тому моменту, пока эта сумма сама не станет цифрой. Например, для числа 9999999 цифровой корень находится так:
9+9+9+9+9+9+9=63
6+3=9.

Программа, которая решает эту задачу через циклы у меня есть. Не могу сделать из неё рекурсивную. Прошу помощи

Код:
Program Example_18;
Var n, k, s : Longint;
Begin
Writeln('Введите число');
Readln(n);
s:=n;
While s>9 Do
Begin
k:=s; s:=0;
Repeat
s:=s+k Mod 10;
k:=k Div 10;
Until k=0;
End;
Writeln('цифровой корень числа ',n,' равен ',s);
End.
Feran вне форума Ответить с цитированием
Старый 07.12.2010, 23:13   #2
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Замени всю вот эту часть на рекурсивную функцию .

Код:
s:=n;
While s>9 Do
Begin
k:=s; s:=0;
Repeat
s:=s+k Mod 10;
k:=k Div 10;
Until k=0;
End;
У тебя должно быть что то вроде такого :

Код:
s:= func (n);
сама функция примерно такая , просто напиши его на твоем языке программирования , у меня просто его нет на компе

Код:
func(n)
{
   if (n == 0)
     return 0;

   return (n Mod 10) + func(n Div 10);
}
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 07.12.2010, 23:47   #3
Feran
 
Регистрация: 04.04.2010
Сообщений: 8
По умолчанию

Как там было сказано ? "Чтобы понять рекурсию нужно понять рекурсию"? А я раньше не понимал почему её недолюбливают

Код:
Program Example_18;
uses crt;
Var n, k, s : Longint;
function func(r:Longint):Longint;
begin
     if r=0 then func:=0
     else func:=(r mod 10)+ func(r div 10);
end;
Begin
clrscr;
Writeln('Vvedite chislo');
Readln(n);
{s:=n;}
{While s>9 Do}
{Begin
k:=s; s:=0;}
s:=func(n);
{End;}
Writeln('tsifrovoi koren shicla',n,' raven ',s);
readkey;
End.

начудил я с именем переменных, теперь исправил. Прога работает но не правильно

Последний раз редактировалось Feran; 07.12.2010 в 23:54.
Feran вне форума Ответить с цитированием
Старый 07.12.2010, 23:53   #4
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

попробуй вот так :

Код:
Program Example_18;
uses crt;
Var n, k, s : Longint;
function func(r:Longint):Longint;
begin
     if r=0 then func:=0
     else func:=(r mod 10)+ func(n div 10);
end;
Begin
clrscr;
Writeln('Vvedite chislo');
Readln(n);
s:=0;
s:=func(n);
Writeln('tsifrovoi koren shicla',n,' raven ',s);
readkey;
End.
Вот только я не уверен насчет правильного количества End
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 08.12.2010, 00:08   #5
Feran
 
Регистрация: 04.04.2010
Сообщений: 8
По умолчанию

Запустил код всё равно не так выполняется

Код:
Program Example_18;
uses crt;
Var n, k, s : Longint;
function func(r:Longint):Longint;
begin
     if r=0 then func:=0
     else func:=(r mod 10)+ func(r div 10);
end;
Begin
clrscr;
Writeln('Vvedite chislo');
Readln(n);
s:=0;
repeat { ошибка в каком-то условии и сейчас раскажу с чего я это взял}
s:=func(n); { обычный вызов функции. Я ввожу значения 34697 он выдаёт 29, т.е он сложил все цифры и это правильно, но потом выходит из цикла}
until s>9;
k:=func(s); { Ещё один вызов функции, теперь входным данным является 29 и результатом является 11 что тоже правильно. Логично будет если сделать третий вызов функции то при вводимом значении 11 ответ будет 2 что является правильным. 
Имеем правильно выполнимую задачу но ошибку в условии продолжения рекурсии}
Writeln('tsifrovoi koren shicla ',n,' raven ',k);
readkey;
End.
Feran вне форума Ответить с цитированием
Старый 08.12.2010, 00:17   #6
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Цитата:
Сообщение от Feran Посмотреть сообщение
Запустил код всё равно не так выполняется

Код:
Program Example_18;
uses crt;
Var n, k, s : Longint;
function func(r:Longint):Longint;
begin
     if r=0 then func:=0
     else func:=(r mod 10)+ func(r div 10);
end;
Begin
clrscr;
Writeln('Vvedite chislo');
Readln(n);
s:=0;
repeat { ошибка в каком-то условии и сейчас раскажу с чего я это взял}
s:=func(n); { обычный вызов функции. Я ввожу значения 34697 он выдаёт 29, т.е он сложил все цифры и это правильно, но потом выходит из цикла}
until s>9;
k:=func(s); { Ещё один вызов функции, теперь входным данным является 29 и результатом является 11 что тоже правильно. Логично будет если сделать третий вызов функции то при вводимом значении 11 ответ будет 2 что является правильным. 
Имеем правильно выполнимую задачу но ошибку в условии продолжения рекурсии}
Writeln('tsifrovoi koren shicla ',n,' raven ',k);
readkey;
End.
Это не тот код , который я тебе написал ... Я не пойму , какую тебе сумму надо найти тогда , зачем ты по несколько раз запускаешь рекурсивную функцию , почему ты не можешь просто взять код , который я тебе написал и запустить его ???
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 08.12.2010, 00:22   #7
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

теперь понял , что тебе надо . Тебе надо еще одну рекурсивную функцию просто .
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 08.12.2010, 00:25   #8
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Попробуй вот это :

Код:
Program Example_18;
uses crt;
Var n, k, s : Longint;

function fun(t:Longint):Longint;
begin
     if r=0 then func:=0
     else func:=(t mod 10)+ func(t div 10);
end;

function func(r:Longint):Longint;
begin
     if r<10 then func:=r
     else func:= func(fun(r));
end;

Begin
clrscr;
Writeln('Vvedite chislo');
Readln(n);
s:=0;
s:=func(n);
Writeln('tsifrovoi koren shicla',n,' raven ',s);
readkey;
End.
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 08.12.2010, 00:26   #9
Feran
 
Регистрация: 04.04.2010
Сообщений: 8
По умолчанию

Сначала я написал код с ошибками в переменных и выложил его в форум. Вы взяли этот код с моими ошибками и работали с ним. Ваша программа работает, но ответ не сходится с правильным.

Несколько раз я запускаю функцию чтобы эксперементально проверить правильно ли написана сама рекурсивная функция, и судя по ответам она написана правильно. А в самом выполнеии программы нужно ещё несколько раз выполнить вызов фунции чтобы получился ответ правильным
Feran вне форума Ответить с цитированием
Старый 08.12.2010, 00:29   #10
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Цитата:
Сообщение от Feran Посмотреть сообщение
Сначала я написал код с ошибками в переменных и выложил его в форум. Вы взяли этот код с моими ошибками и работали с ним. Ваша программа работает, но ответ не сходится с правильным.

Несколько раз я запускаю функцию чтобы эксперементально проверить правильно ли написана сама рекурсивная функция, и судя по ответам она написана правильно. А в самом выполнеии программы нужно ещё несколько раз выполнить вызов фунции чтобы получился ответ правильным
Посмотри мое последнее сообщение , я там написал рекурсивную функцию . Должно все считать ,что тебе надо . Просто сперва не понял до конца условие . Если будет работать , не откажусь от плюсика
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Выделить подстроку, которая соответствует записи целого числа rager06 Помощь студентам 4 08.09.2010 21:41
Описать рекурсивную функцию MaxElem ошибка dexter2145 Помощь студентам 2 11.06.2010 16:59
Составить программу которая находит индекс числа в массиве случайных чисел MadNikys Помощь студентам 9 03.03.2010 20:52
С++ Составить функцию для подсчета числа серий положительных, отрицательных чисел и нулей KASPEER Помощь студентам 0 13.01.2010 15:19
разработать функцию, которая определяет сумму цифр целого числа IceAgainstIce Общие вопросы Delphi 5 20.11.2008 00:52