Моя проблема трудно объяснить.
Я хочу создать функцию, содержащую вложенные циклы 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
это можно сделать без рекурсии, используя itertools.product
import itertools
def function(n):
for x in itertools.product(range(n),repeat=n):
whatever()
Вот, пожалуйста. Позвольте диапазонам быть вашими диапазонами, воздействуйте на результат, когда вам нужно.
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]