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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2018, 23:34   #1
1101ь
 
Регистрация: 12.09.2018
Сообщений: 4
По умолчанию задача на рекуррентность

Во вложении описана данная функция. Нужно написать программу, которая принимает два аргумента и выводит значение функции.Проблема в том, что программа работает медленно, и у меня проблема с пониманием как правильно использовать мемоизацию.

int fm[50];


int power(int base, int exponent){
int result = 1;
while (exponent > 0){
if(exponent%2!=0){
result = (result*base);
}
exponent/=2;
base = (base*base);
}
return result;
}

int F(int n, int i){
int f;
int fsum=0;
if (fm[f]!=0){
return fm[f];

}


if(i < n){
return i;
}else{
for(int j = 1; j <= n; j++){
f = power(-1, (j+1)) * j * F(n, i-j);
fsum+=f;
fm[n]=fsum;

}}
return fm[n];

}


int main(int argc, char *argv[]){
int n, k;
scanf("%d %d", &n, &k);
printf("%d\n",F(n, k));
return 0;
}
Изображения
Тип файла: jpg Screenshot_1.jpg (19.7 Кб, 37 просмотров)
Тип файла: jpg Screenshot_6.jpg (7.9 Кб, 30 просмотров)
1101ь вне форума Ответить с цитированием
Старый 06.10.2018, 00:28   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Никогда не пишите так.
Код:
power(-1, (j+1))
Математики так выражают изменение знака, для компьютера проще вычислить
Код:
(j&1?1:-1)
И вообще, избегайте в программировании возведения в целую степень, особенно, если степень меньше 4. Если применяете, применяйте системную фнкцию, лучше Вы не напишете.

Так как мы вычисляем значения F как сумму меньших элементов, мы можем вычислять с меньших значений функции до верхних.
Код:
constexpr int n = 3;
int f[50] = {};
for(int i = 1; i<50;++i)
{
    if(!f[i]) // Пропускаем, если уже вычисленно
       continue;
    if(i<n)
      f[i] = i;
    else
      for(int j = 1; j<=n;++j)
          f[i]+=(j&1?1:-1)*j*f[i-j];
}
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекуррентность Olaa Помощь студентам 1 10.04.2017 14:20
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51