Как создать многомерную матрицу в python с рекурсией

#python-3.x #recursion #matrix #multidimensional-array

Вопрос:

Допустим, я определил функцию для генерации списка из 6 случайных целых чисел в диапазоне от 0 до 10

 import random
def func():
    randomlist = random.sample(range(11), 6)
    return randomlist
 

Бежать:

 func()
 

Выход:

 [3, 7, 10, 9, 4, 1]
 

Теперь я хочу определить другую функцию, которая вызывает функцию func() внутри с параметром n для создания многомерной матрицы, где каждый элемент будет заменен вновь созданным списком, сгенерированным функцией func (), и n-это время завершенной замены (так что общее количество целых чисел в матрице будет 6^n) — например —

когда n=1, ожидаемый результат:

 [3, 7, 10, 9, 4, 1]
 

когда n=2, ожидаемый результат:

 [[6, 2, 9, 1, 4, 0],
[7, 8, 1, 9, 4, 1],
[1, 0, 4, 6, 3, 1],
[9, 4, 3, 8, 6, 7],
[2, 4, 3, 9, 5, 6],
[4, 7, 2, 0, 1, 8]]
 

когда n=3, ожидаемый результат:

 [[[4, 7, 3, 0, 2, 8],[1, 5, 6, 5, 4, 8],[8, 9, 6, 5, 10, 4],[7, 8, 6, 6, 4, 10],[7, 8, 1, 0, 2, 3],[4, 5, 8, 5, 4, 6]],
[[1, 7, 2, 0, 2, 8],[4, 5, 8, 8, 4, 5],[9, 5, 6, 2, 1, 3],[5, 4, 1, 2, 6, 10],[7, 5, 4, 1, 1, 4],[9, 6, 5, 2, 2, 1]],
[[8, 2, 7, 10, 2, 7],[8, 9, 5, 4, 5, 5],[5, 8, 7, 7, 4, 6],[9, 5, 9, 10, 5, 4],[1, 4, 5, 6, 5, 7],[9, 8, 7, 6, 5, 1]],
[[0, 7, 4, 0, 1, 9],[4, 7, 3, 0, 2, 8],[8, 9, 6, 5, 10, 4],[8, 2, 7, 10, 2, 7],[[7, 5, 4, 1, 1, 4],[7, 8, 1, 9, 4, 1]],
[[9, 5, 3, 9, 2, 8],[8, 9, 6, 5, 10, 4],[9, 4, 3, 8, 6, 7],[3, 7, 10, 9, 4, 1],[4, 7, 3, 0, 2, 8],[9, 4, 3, 8, 6, 7]],
[[5, 3, 4, 5, 2, 10],[[7, 5, 4, 1, 1, 4],[4, 7, 3, 0, 2, 8],[4, 5, 8, 8, 4, 5],[7, 8, 1, 9, 4, 1],[8, 2, 7, 10, 2, 7]]]
 

Я думаю, что мне понадобилась бы рекурсивная функция, но я совершенно без понятия. Есть какие-нибудь идеи? Большое спасибо.

Комментарии:

1. Если ваша вторая функция такова def n_dimensional_matrix(n): , задумывались ли вы о том, каким будет базовый вариант? Базовым случаем является некоторое условие в этой функции, которое заставляет ее не вызывать саму себя, чтобы избежать бесконечной рекурсии. Затем, когда условие базового варианта не выполняется, он выполнит рекурсивный вызов, но ему необходимо изменить n аргумент, чтобы приблизиться к базовому варианту, опять же, чтобы избежать бесконечной рекурсии.

Ответ №1:

Ну , базовый случай 1-это просто позвонить вам func , в противном случае создайте список рекурсивных вызовов по n-1 6^(n-1) времени:

 def recur_6(n):
    if n <= 1:
        return func()
    return [recur_6(n-1) for _ in range(6**(n-1))]
 

Живой пример