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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 00:17   #1
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию Преобразовать рекурсивную функцию

Преобразовать рекурсивную функцию в линейную:
int F( int n){
if(n%10>0) return n%10;
if(n==0) return 0;
else return F(n/10);
}
Помогите, пожалуйста
akademochka вне форума Ответить с цитированием
Старый 05.03.2013, 01:19   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вроде так
Код:
while(n && !(n%10)) n /= 10;
return n%10;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.03.2013, 11:34   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Преобразовать рекурсивную функцию в линейную:
Код:
int F( int n){
if(n%10>0) return n%10;
if(n==0) return 0;
else return F(n/10);
}
Первый шаг (опционально): упростить код. Обратите внимание, что, если n==0, то n%10==0 - то есть, второе условие можно выкинуть.
Код:
int F( int n){
if(n%10>0) return n%10;

else return F(n/10);
}
Второй шаг: перевести рекурсию в хвостовую форму (т.е. такую, что рекурсивный вызов идёт только в форме return F(); ) - уже сделано.
Третий шаг: обернуть всю функцию в цикл while(true), рекурсивные вызовы с return заменить на блоки кода, модифицирующие значения переменных и завершающиеся continue.
Код:
int F( int n){
  while(true){
    if(n%10>0) return n%10;
    else {
      n = n/10;
      continue;
    }
  }
}
Четвёртый шаг (опционально): упростить код. continue не нужен, так как это всё равно конец итерации; выход из цикла произойдёт только по условию n%10>0, поэтому его можно инвертировать и перенести в условие while. Также, n%10 не может быть меньше 0.
Код:
int F(int n){
  while(n%10==0){
    n = n/10;
  }
  return n%10;
}
Окончательно,
Код:
int F(int n){
  while(n%10==0) n /= 10;
  return n%10;
}
Abstraction вне форума Ответить с цитированием
Старый 05.03.2013, 12:35   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Abstraction, проверьте, пожалуйста, на n = 0.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.03.2013, 12:40   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А. Раззява. Да, условие надо не убирать, но можно слить:
Код:
int F( int n){
if(n%10>0 || n==0) return n%10;

else return F(n/10);
}
Инвертированное, соответственно:
Код:
int F(int n){
  while(n%10==0 && n!=0){
    n = n/10;
  }
  return n%10;
}
И, окончательно,
Код:
int F(int n){
  while(n%10==0 && n!=0) n /= 10;
  return n%10;
}
Извиняюсь за ляп.

Правда, теперь можно обратить внимание, что, если на начало цикла n!=0, то n не станет равно нулю ни на какой итерации - то есть, проверку на ноль можно сделать один раз, перед началом цикла:
Код:
int F(int n){
  if(n==0) return 0;
  while(n%10==0) n /= 10;
  return n%10;
}

Последний раз редактировалось Abstraction; 05.03.2013 в 12:43.
Abstraction вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Индекс максимального элемента через рекурсивную функцию. metallfly Visual C++ 4 13.01.2013 23:01
Описать рекурсивную функцию! glebast Помощь студентам 3 28.12.2011 20:51
Описать рекурсивную функцию в PascalABC Aimet Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2011 20:52
Написать рекурсивную функцию. Solnze2 Помощь студентам 0 20.05.2011 15:14
Описать рекурсивную функцию MaxElem ошибка dexter2145 Помощь студентам 2 11.06.2010 16:59