Вызов функции для несвязанной переменной меняет другую переменную - PullRequest
0 голосов
/ 07 ноября 2019

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

  • Он принимает целочисленное значение length, котороесколько дней должно длиться расписание.
  • Он принимает целочисленное значение each, представляющее собой количество предметов в каждом дне.
  • Само расписание представляется как [][]string, поэтомукаждый день представляет собой список предметов.

Идея заключается в следующем:

  1. Начните со списка предметов
  2. Перетасуйте список и разместите последовательнодо тех пор, пока список не станет пустым или мы не достигнем желаемого размера расписания.
  3. Немного перетасуем список, который мы только что использовали, меняя пары случайным образом, перемещаясь слева направо.
  4. Хотя расписание не имеет желаемой длины, перейдите к пункту 2.

Это код, который я использовал для реализации этого:

func timetable(list []string, length int, each int) [][]string {
    table := [][]string{}

    shuffled := shuffle(list)
    chunks := chunk(shuffled, each)

    for i := 0; i < len(chunks) && i < length; i++ {
        table = append(table, chunks[i])
    }

    for len(table) < length {

        // Somehow shuffling this list changes the table
        fmt.Println("Before slightly shuffle =>", table)
        shuffled = slightlyShuffle(shuffled)
        fmt.Println("After slightly shuffle =>", table)

        chunks = chunk(shuffled, each)

        for i := 0; i < len(chunks); i++ {
            table = append(table, chunks[i])
        }
    }

    return table
}
  • shuffle тасованиясписок usiАлгоритм Фишера-Йетса
  • slightlyShuffle перемещается слева направо и меняет значения рядом друг с другом в 2/3 времени.
  • chunk берет список и разбивает его накуски n размера. Например:
chunk([]string{"a", "b", "c", "d", "e"}, 2) => ["a", "b"], ["c", "d"], ["e"]

Однако проблема возникает, когда мы слегка перетасовываем список. По какой-то причине легкое перетасовывание списка изменит переменную table. Запуск вышеуказанной программы сгенерирует вывод:

Before slightly shuffle => [[Music Biology Chemistry] [Computing Maths English] [Physics]]
After slightly shuffle => [[Music Biology Computing] [Maths Chemistry Physics] [English]]

Как видите, несмотря на вызов slightlyShuffle для переменной shuffled, она меняет табличную переменную. Любая помощь в том, почему это или потенциальное решение проблемы будет принята с благодарностью.

Полная программа: https://play.golang.org/p/ayNxxnqSE3s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...