формула полинома

Тема в разделе "WASM.ZEN", создана пользователем roko, 3 дек 2009.

  1. roko

    roko New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2009
    Сообщения:
    2
    Нужно перебрать все значения степеней слагаемых в формуле полинома.
    Вот эта формула:
    Для любых отличных от нуля действительных чисел a1,a2,...,ar и любого натурального n
    [​IMG]


    Мне нужно перебрать все последовательности вида k1,k2,...,kr.
    Например для n=3 и r=3, будут такие последовательности:

    3, 0, 0
    2, 1, 0
    2, 0, 1
    1, 2, 0
    1, 1, 1
    1, 0, 2
    0, 3, 0
    0, 2, 1
    0, 1, 2
    0, 0, 3

    количество таких последовательностей, в общем случае, будет [​IMG]

    Хочу пример, желетельно на C или описание алгоритма своими словами.
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Код (Text):
    1. void BruteForce(int i, int n, int r, int * k)
    2. {
    3.     if ( i >= r ) {
    4.         // в массиве k находятся значения k1, k2, ...
    5.         for ( int j = 0; j < r; ++j ) {
    6.             printf( "%d ", k[ j ] );
    7.         }
    8.     } if ( i == r - 1 ) {
    9.         // нужно выбрать последний.
    10.         k[ i ] = n;
    11.     } else {
    12.         // перебираем все возможные значения для i-ого коэф.
    13.         for ( int j = 0; j < n; ++ j ) {
    14.             k[ i ] = j;
    15.             // рекурсивно выбираем оставшиеся.
    16.             BruteForce( i + 1, n - j, r, k );
    17.         }
    18.     }
    19. }
    Что-то типо такого. Писал прямо в браузере, так что может и не заработать. Но пример думаю ясен.
     
  3. roko

    roko New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2009
    Сообщения:
    2
    Forever, спасибо большое. Вот так работает

    Код (Text):
    1. void BruteForce(int i, int n, int r, int * k)
    2. {
    3.     if ( i >= r - 1 ) {
    4.         // нужно выбрать последний.
    5.         if(i==r-1)
    6.             k[ i ] = n;
    7.         // в массиве k находятся значения k1, k2, ...
    8.         for ( int j = 0; j < r; ++j ) {
    9.             printf( "%d ", k[ j ] );
    10.         }
    11.         cout<<endl;
    12.     } else {
    13.         // перебираем все возможные значения для i-ого коэф.
    14.         for ( int j = 0; j < n+1; ++ j ) {
    15.             k[ i ] = j;
    16.             // рекурсивно выбираем оставшиеся.
    17.             BruteForce( i + 1, n - j, r, k );
    18.         }
    19.     }
    20. }