Как мне вычислить количество перестановок в комбинаторике базы 3?

StackOverflow https://stackoverflow.com/questions/447783

  •  22-07-2019
  •  | 
  •  

Вопрос

Я никогда не был силен в математике, и я надеюсь, что кто-нибудь сможет помочь мне со следующим.

У меня есть 5 коробок:

 1   2   3   4   5
[ ] [ ] [ ] [ ] [ ]

Поля могут быть белыми, серыми или черными (или представлять их как 0, 1, 2).

В скольких возможных состояниях может находиться бокс-сет?

Каков псевдокод (или на любом другом языке) для генерации всех возможных результатов??

т. е...

00000
00001
00011
00111

и т.д., и т.п...

Я действительно ценю любую помощь, которую кто-либо может мне оказать в этом.

Это было полезно?

Решение

Это классическая задача генерации перестановок.У вас есть 3 возможности для каждой позиции и 5 позиций.Общее количество сгенерированных строк равно 3^5 = 243.Вам нужна рекурсия, если вы хотите получить общее решение (простой итеративный цикл работает только для одного экземпляра проблемы).

Вот краткий пример:

public static void Main(string[] args){

    Generate("", 5);
}

private void Generate(string s, int limit)
{
    if (s.Length == limit)
        Console.WriteLine(s);
    else
    {
        Generate(s+"0", limit);
        Generate(s+"1", limit);
        Generate(s+"2", limit);
    }
}

Другие советы

ответом на количество комбинаций является:3x3x3x3x3 (3 ^ 5), поскольку каждая коробка может иметь 3 возможных цвета.

Что касается генерации результатов, посмотрите, сможете ли вы вычислить это, используя эту матрицу с 0, 1 или 2 для представления цвета рамки.В меньшем масштабе (предположим, 3 блока) это выглядело бы примерно так:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2

Чтобы ответить на ваш первый вопрос, каким был бы ответ, если бы поля могли содержать только одно из двух значений?Итак, каков ответ, если поля содержат одно из трех значений?

Чтобы ответить на ваш второй вопрос, какой псевдокод генерирует все возможные результаты одного блока?Теперь псевдокод генерирует все возможные результаты двух блоков?

Я бы рекомендовал сначала решить проблему на бумаге.Попробуйте решить ее с меньшим количеством блоков (возможно, с тремя) и перечислите все возможности.Затем подумайте о том, как вы рассуждали, или как бы вы объяснили то, что вы сделали маленькому ребенку.

Спасибо вам всем за ваши ответы, по крайней мере, тем из вас, кто действительно дал мне один.

Хотя я могу оценить, что вопрос звучал так, как будто он был взят прямо из Computer Science 101, это было не так.Ирония в том, что это было для реальной жизни в реальные сроки, и у меня не было времени вспомнить, когда меня этому учили, и я сказал себе: "когда мне вообще понадобится это дерьмо".

Если бы я хотел, чтобы меня опекали и обращались со мной как со школьником, я бы вернулся в свою начальную школу и спросил своего учителя 5-го класса, могу ли я может иди в ванную

Еще раз спасибо

количество состояний равно 3^ 5.

псевдокод - это

for value from 0 to 3^5-1
    print base3(value)

где base3 - это функция, которая многократно принимает значение по модулю 3 для получения цифры, затем удаляет эту цифру (путем деления на 3)

Подсказка:представьте, что каждая ячейка - это позиция в числе, а каждый цвет - это отдельная цифра.В реальном мире, сколько комбинаций (включая ноль) вы получаете с 2 позициями и 10 возможными цифрами?Как насчет 3 позиций?Какова связь между добавлением дополнительной позиции и количеством комбинаций, учитывая количество доступных вам цифр?

Уникальное количество комбинаций: 3^5=243

Код:

n = 0
for i = 0 to 3^5-1
{
    s = ""
    for j = 1 to 5
    {
        d = n mod 3
        s = toascii(d) . s
        n = n / 3
    }
    println s
    i = i + 1
}

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

__ x __ x __ x __ x __ = ?

В каждом пустом поле напишите количество объектов, из которых вы должны выбрать для этого поля.Поскольку у вас есть 3 числа на выбор для каждого поля, вы пишете 3 в каждый пустой:

3 x 3 x 3 x 3 x 3 = 243

Это дает вам общее количество перестановок для этих вариантов.

Количество возможностей равно 3 в степени 5

Если вы выполните цикл от 0 до этого числа минус 1 и выразите его в базе 3, у вас будут все возможности (не забудьте добавить 0 там, где это необходимо)

В Ruby:

number_of_possibilities = 3**5-1

for i in (0..number_of_possibilities)
  base_3_number = i.to_s(3)
  puts "%05d" % base_3_number # number formatting used to prepend 0s where necessary
end

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

Если бы вы либо работали на меня, либо были в моем классе, я бы просто спросил следующее...

"Как, по-вашему, следует решить проблему?" Ответ на который может показать, на чем вы зациклились.Мой мудрый профессор в КМУ однажды сказал: "Я не могу помочь вам понять это, пока вы не узнаете, чего вы не понимаете" Я так и не выяснил, чего я не понял, и я бросил его занятие, но урок запомнился мне.

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

Ваша проблема не нуждается ни в чем большем, чем в правило продукта в комбинаторике.

Вы можете выбрать состояние Первый коробку тремя способами, и состояние второй коробят 3 способами, и...и состояние 5-й коробки тремя способами.Количество способов, с помощью которых вы можете установить состояние всех блоков, равно произведению всех пяти (равных) чисел способов, т. е.3x3x3x3x3 = 35.

Похожий вопрос:сколько чисел вы можете составить из 5 цифр в десятичной системе, считая начальные нули?То есть, сколько существует чисел от 00000 до 99999?Вы можете выбрать первую цифру 10 способами (0...9), и так далее, и так далее, и ответ будет 10x10x10x10x10 = 100000, как вы уже знаете.

Это похоже на домашнюю задачу.Тогда я просто помогу вам найти решение.

Вы хотите сказать, что каждая коробка имеет три состояния, которые все независимы.В одном блоке было бы 3 решения, а в двух блоках было бы 3 * 3 решения - для каждого состояния первого блока во втором блоке также было бы три состояния.Увеличьте это количество до 5 коробок.

Чтобы сгенерировать каждое решение, вы можете просто циклически просматривать его.Легко создать вложенные циклы for для каждого блока, и умножение на степени 10 может позволить вам сразу показать число.

Вы можете обобщить код для нескольких блоков аналогичным образом.

Даже не пытайтесь писать код, чтобы ответить на этот вопрос!Причина в том, что для его вычисления вам нужно несколько очень больших чисел (факториалов).Они создают числа, намного большие, чем любой базовый тип в среде CLR.Вы можете использовать это библиотека с открытым исходным кодом чтобы произвести расчет.

void solve(int p=0,int n=5,int d=0)
{
    if (n==p)
    {
        int rev=d;
        int i=0;
        while (i<5) {
            cout << rev%10;
            rev /= 10;
            i++;## Heading ##
        }
        cout << endl;
        return;
    }
    for(int i=0; i<3 ; i++)
    {
        solve(p+1,n, d*10 + i);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top