powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помощь с рекурсией и мемоизацией
25 сообщений из 32, страница 1 из 2
Помощь с рекурсией и мемоизацией
    #39714041
1101ь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, пожалуйста с задачей. Нужно написать код, который принимает два значения (n и k) и выдает значение функции (описана во вложении). Программа работает медленно для больших чисел, и у меня проблемы с пониманием как использовать мемоизацию и не считать уже вычисленные значения раннее.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
int F(int n, int i){
    int f;
    int fsum=0;
 
  if(i < n){
    return i;
  }else{
  for(int j = 1; j <= n; j++){
    f = j * F(n, i-j);
    if(j%2==0){
        f=-f;
    }
    fsum+=f;
  }
}
 return fsum;
 
}


int main(int argc, char *argv[]){
  int n, k;
  scanf("%d %d", &n, &k);
  printf("%d\n",F(n, k));
  return 0;
}


Модератор: Для оформления исходников есть тэг [ SRC ]
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714042
1101ь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714054
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мемоизация - это запоминание однажды посчитанного, т.е. кэширование.

Схематично так работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
func F(n, k) {
   res = cache.find(n, k); // проверка кэша на наличие ответа для конкретных (n, k)
   if(res != NULL) return res; // если есть ответ - возврат его
   ... расчет res
   cache.add(n, k, res); //сохранение в кэш ответа для конкретных (n, k)
   return res;
}
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714144
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
/* Подсчёт суммы ф-й. На входе n + i, а ф-я должна пробежать от 1 (j) до максимума (n) с учётом (i) в формуле.

n = сколько раз суммировать тело из sum1 * sum2 * sum3
i = фикс.параметр передаётся в ф-ю
j = итерация
*/

#include <iostream>
#include <cmath>

using namespace std;

//##############################################################################
// суммирование через рекурсию
int F(int n,   int i)
{
    if (i < n)    {return i;}   // по условию

    int itogo = 0;
    for (int j = 1;   j <= n;   j++)
    {
/* debug:
        int sum1 = pow(-1,  (j +1));    // (ok) чётная степень = 1;  нечет = -1. Т.е. нечётный j -> sum1 = 1, чётный j -> sum1 = -1.
        int sum2 = sum1 * j;            // (ok) n=3, i=3, j=3  = 3
        int sum3 = F(n, i - j);         // (ok) рекурсия
        int sum_body = sum2  * sum3;

printf("sum1 = %d, sum2 = %d, sum3 = %d, sum_body = %d\tпри: n = %d,  i = %d,  j = %d\n\n",    sum1, sum2, sum3,  sum_body,  n, i, j);
*/
        itogo += pow(-1,  (j +1))   * j   * F(n, i - j);
    }

    return itogo;
}
//##############################################################################
int main(int argc, char *argv[])
{
    system("clear");

    if (argc != 3)    {cout << "формат запуска: " << argv[0] << " int int (2 целых числа для: n И i)\n\n";    return 0;}

    cout << F(atoi(argv[1]), atoi(argv[2])) << "\n";

    return 0;
}



авторМемоизация - это запоминание однажды посчитанного, т.е. кэширование.
в данном случае и так считает мгновенно, даже "./a.out 345873853 193845738"
да и такие простейшие расчёты имхо проще, чем запоминать каждую цифру, а потом ещё if делать на каждую
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714148
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь нужна не мемоизация а просто некий умный способ сворачивания рекурсии с использованием
частично накопленного результата. Как в фибоначчи. Прямая в лоб реализация - генерирует избыточное
дерево расчетов.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714160
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗдесь нужна не мемоизация а просто некий умный способ сворачивания рекурсии с использованием
частично накопленного результата. Как в фибоначчи. Прямая в лоб реализация - генерирует избыточное
дерево расчетов.
это уже к математикам на форум
а мы только можем озаботиться, чтобы данные в L1/L2 -кэш попали
ну так они вроде там
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714202
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Математики тем более таким не занимаются. Это чисто it-шный вопрос.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714259
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМатематики тем более таким не занимаются. Это чисто it-шный вопрос.

в первую очередь, это вопрос терминологии.
это не вопрос information technology, над такими вопросами в computer science трудятся.
:))

Так или иначе, в русском языке нет адекватного перевода ни тому, ни другому.
По русски это, в любом случае, дело "программиста".
И, мне кажется, что это скорее хорошо, чем плохо.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714351
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хорошо.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714500
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМатематики тем более таким не занимаются. Это чисто it-шный вопрос.
ну технически вы правы
думаю, математики уже над этой задачей поработали
однако нам тут тоже предложить особо нечего, кроме констант на 1000 значений, например
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714632
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй перевернуть цикл вверх ногами.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714667
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для сравнения с 0 чтоли?
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

Ноль здесь не причем. Понаблюдай какие аргументы пойдут в функцию F().
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714674
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1101ьПомогите, пожалуйста с задачей. Нужно написать код, который принимает два значения (n и k) и выдает значение функции (описана во вложении). Программа работает медленно для больших чисел, и у меня проблемы с пониманием как использовать мемоизацию и не считать уже вычисленные значения раннее.Получается, что имеем одномерный массив большой длины, который определяется только одним число n. Число k себя никак не проявляет.

В результате имеем первые начальные n чисел, как исходные, а каждое следующее число есть сумма n предыдущих чисел с коэффициентами.
Может быть k есть число, указывающее когда нужно остановиться?

Если массив уж очень большой, и n большое, то конечно будет долго идти вычисления. И негде убыстрить: коэффициенты у предыдущих чисел всегда разные.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714675
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПонаблюдай какие аргументы пойдут в функцию F().
ровно те же самые
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714689
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухmaytonПонаблюдай какие аргументы пойдут в функцию F().
ровно те же самые!
Да но в каком порядке? И можем ли мы получить с этого выгоду?
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714725
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ можем ли мы получить с этого выгоду?
нет.
и кончай загадками говорить.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714862
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Область определения этой функции это квадрант с осями n,k . Квадрант в свою очередь разбит на 2 телесных угла под 45 градусов. Одну половинку можно не вычислять. Она тривиальна. А другую вычислять и мемоизировать.

+Ещё стоит вопрос целочисленного переполнения.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714870
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В мемоизационой области можно поискать формулу множителя на который надо домножить соседнюю ячейку чтобы получить f(n,k). Если получится - уйдет цикл.

По аналогии с треугольником Паскаля.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714900
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМатематики тем более таким не занимаются. Это чисто it-шный вопрос.
что-то я пока что вижу чистую математику
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714924
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что именно напугало?
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39714955
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗдесь нужна не мемоизация а просто некий умный способ сворачивания рекурсии с использованием
частично накопленного результата. Как в фибоначчи. Прямая в лоб реализация - генерирует избыточное
дерево расчетов.
Если подразумевается матричное решение "как в фибоначчи", то да.
Здесь рекуррентное соотношение, представимое в матричной форме.
И решение должно быть тем же - возведение в степень единичной производящей матрицы.
Отличие в том, что здесь размер матрицы является параметром n.
Вероятно, это должно достаточно красиво программироваться без мемоизации.
Кажется, что надо только со скрижалей пыль подсдуть...
Это требует некоторого времени, гороха и установления места- где поставлены те скрижали.

Без гороха и теории на наивный вариант мемоизации можно было бы смотреть так:

Пусть есть массив, мемоизирующий все значения k для заданного n.
Тогда его первые n элементов от 0 до n-1 окажутся просто заполнены числами, равными своему индексу.

А начиная с индекса n пойдут рекуррентно вычисляемые значения в пределах скользящего
окна размером n.
Если такой массив разделить на слоты, слайсы размером в n элементов массива,
то значение к-го элемента, считая с нуля, окажется в слайсе с номером m = k \ n,
где \ - целочисленное деление.

А его номер в слайсе будет l = k mod n - остаток целочисленого деления k на n.

Проводя заполнение массива на размер целого слайса и храня номер последнего
вычисленного слайса, легко получить простой цикл, довычисляющий необходимый m-ый
слайс, если он не был вычислен раньше.

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

Если отказаться от тотальной мемоизации и амортизированного константного времени доступа
к значению для (n,k), то достаточно работать просто с массивом размера n+n
(или парой массивов - n и n+n) и циклом, вычисляющим значения m-го слайса.

В зависимости от деталей контекста, это кажется и может оказаться перспективным.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39715001
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто именно напугало?
математика это определённый склад ума
читай - армию нейронов нужно создавать, долго и усердно решая задачки
я, в принципе, не сильно против, но нет пока ни времени, ни достаточной мотивации
посматриваю иногда видики Савватеева:
YouTube Video
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39715043
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, не жалейте себя.

Просто берите и делайте. Не боги горшки обжигают.
...
Рейтинг: 0 / 0
Помощь с рекурсией и мемоизацией
    #39715191
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton.. Не боги горшки обжигают.
Смыслы крылатых фраз плывут и, как правило, меняют свои значения на прямо противоположные исходным.
Эту фразу часто используют в контексте - это легко и просто, тут нет ничего сложного.
Между тем,

Конечно, горшки обжигают именно боги.
Гефест, например, большой умелец и этого искусства тоже, как связанного с огнем.

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

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

Что тогда отличает, владеющих обжиганием горшков людей от богов,
кроме бренности человеческой жизни?

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

Иначе зачем бы Одиссей убегал от Калипсо, если бы бессмертие не было бы проклятием, и обладало хоть какой-нибудь ценностью.

У бессмертия есть одна особенность, тревожащая людей - на него обречены боги.
Но человеку не нужно бессмертие, чтобы жить рядом с ними и независимо от них.
Гончарного искусства достаточно.

И оно дано даром (с точки зрения людей), но это не значит, что оно не является тайной
и не требует, усилий, приверженности и любви к нему.
Гончар, как и любой ремесленник, это человек способный творить, и творящий шедевр.

И плата, взятая Прометеем с людей за возвращенный/подаренный огонь,
как раз и заключается в готовности людей жить всегда рядом с богами, но независимо от них,
через и с помощью непрерывного создания шедевров.

maytonполудух, не жалейте себя.

Просто берите и делайте.

Ну да, что-то в этом роде.
В том смысле, что дерзай.
Дерзай, стремясь понять и соединить в себе искусство всех творящих богов разом.

Это подразумевает какое-то учение. Хотя бы самоучение.
Но нельзя сотворить шедевр, не дерзнув. Не сказав - вот это я сейчас сделаю сам.

К счастью, пока глину земли не поставили в огонь для обдува жарким воздухом Солна,
её можно смочить водой и пытаться лепить заново.

Разминая глину, человек владеет вселенной, всеми её стихиями.
Да горшки обжигают не боги. Аккуратнее сказать - не только боги.
Но это не значит, что слепив кривой горшок можно сказать - ладно, и так сойдет.

Хоть мы и рядом с богами, но не в Тридевятом Царстве.
Тут, неровён час, и голову отрубить могут, совсем как у богов.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помощь с рекурсией и мемоизацией
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]