Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Задача по JS (https://javascript.ru/forum/job/34513-zadacha-po-js.html)

Gambit228 08.01.2013 14:22

Задача по JS
 
Здравствуйте. Возникли небольшие проблемы с программой.
Напишите функцию, аргументом которой является натуральное число n, а результатом - функция, которая последовательно возвращает все возможные массивы натуральных чисел, сумма которых равна n. После перебора функция должна вернуть null
В книге Шеня нашел алгоритм, прочитал, попробовал написать программу
Считает неверно.

Deff 08.01.2013 14:50

http://www.proklondike.com/var/file/...my_Zadachi.rar
:) А. Шень: Программирование: теоремы и задачи

Если алгоритм отсюда = то укажите страницу и раздел.

Дзен-трансгуманист 08.01.2013 16:13

Цитата:

Сообщение от Gambit228
все возможные массивы натуральных чисел

Вариант 1: Если порядок взаимного расположения чисел в массиве неважен (Разбиение числа)
function createPartitionIterator ( integer ) {

  if ( !isFinite( integer = +integer ) || integer < 1 || integer != integer ^ 0 ) {
    return null;
  }

  var layout = [ integer ];

  return function () {

    if ( !layout ) {
      return null;
    }

    var result, rest, last, offset = layout.length;

    while ( offset-- && layout[ offset ] == 1 ) {}

    if ( offset >= 0 ) {

      result = [].concat( layout );

      rest = layout.length - offset;
      last = --layout[ offset++ ];

      while ( rest > last ) {
        layout[ offset++ ] = last;
        rest -= last;
      }

      layout[ offset++ ] = rest;
      layout.length = offset;
    }

    else {

      result = layout;
      layout = null;
    }

    return result;
  }
}

function test ( integer ) {

  var text = '';
  var next = createPartitionIterator( integer );
  var layout;

  while ( layout = next() ) {
    text += layout + '\n';
  }

  alert( text );
}

test( 2 );
test( 5 );
test( 7 );
test( 10 );

Gambit228 08.01.2013 16:43

2.4.1

Gambit228 08.01.2013 16:43

Раздел 2.4.1

Gambit228 08.01.2013 16:45

Вау. Написали Вы, конечно, классно, только малопонятно(

Дзен-трансгуманист 08.01.2013 17:10

Цитата:

Сообщение от Gambit228
все возможные массивы натуральных чисел

Вариант 2: Если порядок взаимного расположения чисел в массиве важен (Композиция числа)
function createCompositionIterator ( integer ) {

  if ( !isFinite( integer = +integer ) || integer < 1 || integer != integer ^ 0 ) {
    return null;
  }

  var layout = Math.pow( 2, integer - 1 );

  return function () {

    if ( !layout ) {
      return null;
    }

    layout--;

    var result = [], bitmap = layout, last = 1, left = integer;

    while ( left-- ) {

      if ( bitmap % 2 ) {
        last++;
        bitmap--;
      }

      else {
        result.unshift( last );
        last = 1;
      }

      bitmap /= 2;
    }

    return result;
  }
}

function test ( integer ) {

  var text = '';
  var next = createCompositionIterator( integer );
  var layout;

  while ( layout = next() ) {
    text += layout + '\n';
  }

  alert( text );
}

test( 3 );
test( 4 );
test( 5 );
test( 6 );

Дзен-трансгуманист 08.01.2013 17:15

Цитата:

Сообщение от Gambit228
классно, только малопонятно

А практическая математика она вся такая - классная и малопонятная.)

melky 08.01.2013 20:28

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 226021)
А практическая математика она вся такая - классная и малопонятная.)

ну не знаю :)

while (!stopCondition(X0, X1)) {
            F1 = F(X1) - Y;
            F0 = F(X0) - Y;

            DELTA_X = X1 - X0;
            DELTA_F = F1 - F0;

            cache = X1;
            X1 = X1 - F1 * DELTA_X / DELTA_F;
            X0 = cache;
        }


отрывок моего кода. см. метод хорд

тело цикла - эта формула


условие остановки (stopCondition) :


по-моему, всё понятно :)


простите, вредничаю )


Часовой пояс GMT +3, время: 17:27.