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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2013, 20:44   #1
AngelMarik
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 13
Смущение рекурсивная функция

Доброго времени суток!

Делаю лабораторку, задание звучит так:
"Написать программу, использующую рекурсивную функцию для определения, является ли число "почти совершенным". "Почти совершенное" число – это число из ряда натуральных чисел, которое равно сумме своих делителей, не обязательно всех (исключая само число)"

Почти совершенное число, например 12: его делители - 1 2 3 4 6
12=6+3+2+1
12=6+4+2
и т.д

подскажите, пожалуйста как эту задачку решить?

я так понимаю нужно перебором искать суммы делителей числа, а вот как это сделать чет пока не понимаю

на с++ делаю
AngelMarik вне форума Ответить с цитированием
Старый 24.05.2013, 21:19   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Что-то до меня категорически не доходит, где здесь органично вписывается рекурсия.
Нет, вписать-то можно, но обоснование будет для начинающего, самое малое, зубодробительным.
1) Пусть критерий принадлежности числа к почти совершенным - P(n). То есть, P(12) - "верно", P(17) - "неверно".
2) Введём вспомогательное множество троек, заданное критерием Q(n, s, m), соответствующее "s - сумма некоторых делителей n, каждый из которых не меньше m и s можно дополнить некоторыми делителями n меньшими m до суммы, равной n". Перечитайте это ещё раз. То есть, Q(12, 6, 5) - "верно" (к 6 можно добавить делители 12 3, 2 и 1 и в сумме получится 12), а Q(12, 6, 3) - "неверно" (меньше 3 только делители 2 и 1, если прибавить их к 6, 12 мы не получим).
3) Если P(n), то Q(n, 0, n-1) и наоборот. Подумайте, почему.
4) Q(n, n, x) - "верно"; Q(n, y, 1), при y<n -"неверно", Q(n, y, x) при y>n - "неверно".
5) Q(n, s, m) "верно" если и только если Q(n, s, m-1) либо {(n делится на m-1) и Q(n, s+m-1, m-1)}. (Q(n, s, m) верно - значит, к s можно добавить какие-то делители меньше m так чтобы получить n; этот набор либо включает m-1, либо не включает.)
6) А теперь - код (по сути - прямой перенос наших пунктов 3), 4) и 5)):
Код:
bool Q(int n, int s, int m){
  if(s == n) return true; //4)
  if(s > n) return false;
  if(m == 1) return false;

  if(Q(n, s, m-1)) return true; //5)
  if(n % (m-1) != 0) return false;
  return Q(n, s+m-1, m-1);
}

bool P(int n){
  return Q(n, 0, n-1); //3)
}

Последний раз редактировалось Abstraction; 24.05.2013 в 22:42. Причина: Исправление: пункт 3) - критерий, а не свойство.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная функция Solidera Помощь студентам 6 02.04.2013 09:45
Рекурсивная функция --1990Артём Помощь студентам 1 09.12.2012 10:21
Си.Рекурсивная функция Alina111 Visual C++ 1 01.07.2012 03:27
Си++. Рекурсивная функция. Diamond2107 Помощь студентам 6 02.12.2009 19:48