Функция с переменным количеством циклов For (python)

Моя проблема трудно объяснить.

Я хочу создать функцию, содержащую вложенные циклы for,
количество которых пропорционально аргументу, переданному функции.

Вот гипотетический пример:

Function(2)

... будет включать ...

for x in range (y):
    for x in range (y):
        do_whatever()

Другой пример ...

  Function(6)

... будет включать. ..

for x in range (y):
    for x in range (y):
        for x in range (y):
            for x in range (y):
                for x in range (y):
                    for x in range (y):
                        whatever()

Переменные цикла for (y) НЕ используются во вложенном коде.

Первой вашей мыслью было бы создать ОДИН цикл for с диапазоном, равным мощности числового аргумента ...
ЭТО НЕ МОЖЕТ РАБОТАТЬ, потому что продукт был бы ОГРОМНЫМ. У меня требуются экземпляры, где есть 8 вложенных циклов for.
Произведение слишком велико для диапазона в цикле for.

Есть другие аргументы, которые необходимо передать функции, но я могу справиться с этим сам.

Вот код (он создает Фрактал Снежинки)

from turtle import *
length = 800
speed(0)

def Mini(length):
    for x in range (3):
        forward(length)
        right(60)

penup()
setpos(-500, 0)
pendown()   

choice = input("Enter Complexity:")

if choice == 1:
    for x in range (3):
        forward(length)
        left(120)

elif choice == 2:
    for x in range (3):
        Mini(length/3)
        left(120)

if choice == 3:
    for x in range (6):
        Mini(length/9)
        right(60)
        Mini(length/9)
        left(120)

if choice == 4:
    for y in range (6):
        for x in range (2):
            Mini(length/27)
            right(60)
            Mini(length/27)
            left(120)
        right(180)
        for x in range (2):
            Mini(length/27)
            right(60)
            Mini(length/27)
            left(120)

if choice == 5:
    for a in range (6):
        for z in range (2):
            for y in range (2):
                for x in range (2):
                    Mini(length/81)
                    right(60)
                    Mini(length/81)
                    left(120)
                right(180)
                for x in range (2):
                    Mini(length/81)
                    right(60)
                    Mini(length/81)
                    left(120)
            right(180)
        right(180)

if choice == 6:
    for c in range (6):
        for b in range (2):
            for a in range (2):
                for z in range (2):
                    for y in range (2):
                        for x in range (2):
                            Mini(length/243)
                            right(60)
                            Mini(length/243)
                            left(120)
                        right(180)
                        for x in range (2):
                            Mini(length/243)
                            right(60)
                            Mini(length/243)
                            left(120)
                    right(180)
                right(180)
            right(180)
        right(180)

if choice == 7:
    for a in range (6):
        for b in range(2):
            for c in range (2):
                for d in range (2):
                    for e in range (2):
                        for f in range (2):
                            for y in range (2):
                                for x in range (2):
                                    Mini(length/729)
                                    right(60)
                                    Mini(length/729)
                                    left(120)
                                right(180)
                                for x in range (2):
                                    Mini(length/729)
                                    right(60)
                                    Mini(length/729)
                                    left(120)
                            right(180)
                        right(180)
                    right(180)
                right(180)
            right(180)
        right(180)

Буду признателен за любую помощь, которую вы мне можете оказать,
хотя если вы предложите другой метод (например, рекурсию),
пожалуйста, не просто вставляйте код; вместо этого предлагает некоторые идеи, которые могут направить меня в правильном направлении.

(Алгоритм предназначен для специального математического задания)


спецификации:
Python 2.7.1
Черепаха
IDLE
Windows7

30
задан Anti Earth 25 August 2011 в 07:23
поделиться

2 ответа

это можно сделать без рекурсии, используя itertools.product

import itertools
def function(n):
    for x in itertools.product(range(n),repeat=n):
        whatever()
14
ответ дан 27 November 2019 в 23:24
поделиться

Вот, пожалуйста. Позвольте диапазонам быть вашими диапазонами, воздействуйте на результат, когда вам нужно.

ranges=((1,4),(0,3),(3,6))
from operator import mul
operations=reduce(mul,(p[1]-p[0] for p in ranges))-1
result=[i[0] for i in ranges]
pos=len(ranges)-1
increments=0
print result
while increments < operations:
    if result[pos]==ranges[pos][1]-1:
        result[pos]=ranges[pos][0]
        pos-=1
    else:
        result[pos]+=1
        increments+=1
        pos=len(ranges)-1 #increment the innermost loop
        print result

[1, 0, 3]
[1, 0, 4]
[1, 0, 5]
[1, 1, 3]
[1, 1, 4]
[1, 1, 5]
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[2, 0, 3]
[2, 0, 4]
[2, 0, 5]
[2, 1, 3]
[2, 1, 4]
[2, 1, 5]
[2, 2, 3]
[2, 2, 4]
[2, 2, 5]
[3, 0, 3]
[3, 0, 4]
[3, 0, 5]
[3, 1, 3]
[3, 1, 4]
[3, 1, 5]
[3, 2, 3]
[3, 2, 4]
[3, 2, 5]
[1, 0, 4]

Тестирование со следующими результатами даст тот же результат:

for x in range(*ranges[0]):
    for y in range(*ranges[1]):
        for z in range(*ranges[2]):
            print [x,y,z]
3
ответ дан 27 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: