#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))]