two loop how for example create python recursion for-loop nested fractals

loop - python syntax for



Función con número variable de For Loops(python) (7)

Mi problema es difícil de explicar

Quiero crear una función que contenga bucles anidados,
la cantidad de la cual es proporcional a un argumento pasado a la función.

Aquí hay un ejemplo hipotético:

Function(2)

... implicaría ...

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

Otro ejemplo...

Function(6)

... implicaría ...

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()

Las variables del bucle for (y) NO se usan realmente en el código anidado.

Su primer pensamiento podría ser crear UNO para bucle, con un rango que está a la potencia del argumento de número ...
ESTO NO PUEDE FUNCIONAR porque el producto sería ENORME. Tengo instancias requeridas donde hay 8 bucles anidados.
El producto es demasiado grande para un rango en un bucle for.

Hay otros argumentos necesarios para pasar a la función, pero puedo manejarlo yo mismo.

Aquí está el código (crea el Fractal del copo de nieve)

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)

Agradecería cualquier ayuda que puedas darme,
aunque si sugieres un método diferente (como recursividad),
por favor no solo pegue el código; en cambio, sugiere algunas ideas que podrían ponerme en la dirección correcta.

(El algoritmo es para una Asignación matemática especializada)

especificaciones:
Python 2.7.1
Tortuga
OCIOSO
Windows7


¿Has considerado xrange?

for x in xrange(y ** n): whatever()

Y si sobrepasa el límite de xrange, puede usar itertool

import itertools for x in itertools.product(xrange(y), repeat=n): whatever()

(respuesta de itertool anterior utilizada incorrectamente n para el rango en lugar de y)


Aqui tienes. Deje que los rangos sean sus rangos, opere en el resultado cuando lo necesite.

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]

Probar con lo siguiente daría el mismo resultado:

for x in range(*ranges[0]): for y in range(*ranges[1]): for z in range(*ranges[2]): print [x,y,z]


Este problema puede resolverse por recursión. Estoy escribiendo un algoritmo aquí, ya que creo que esto puede ser un problema general.

function Recurse (y, number) if (number > 1) Recurse ( y, number - 1 ) else for x in range (y) whatever()


La recursividad será tu mejor apuesta. Considere lo que debería hacer en el caso base y en el caso recursivo.

Código omitido, según solicitud.


Mi respuesta es tardía, pero suponiendo que quiera hacer varios bucles, por ejemplo, imprima un rango varias veces. Entonces la versión correcta de esta recursión es:

def loop_rec(y, number): if (number > 1): loop_rec( y, number - 1 ) for i in range(y): print(i, end='' '') else: for i in range(y): print(i, end='' '') loop_rec(4,3)

Esto creará tres bucles for con el rango (4)

Si quieres jugar con el rango dinámico, aquí hay algunas variantes:

def loop_rec(y, number): if (number > 1): loop_rec( y+1, number - 1 ) for i in range(y): print(i, end='' '') print('' ;'') else: for i in range(y): print(i, end='' '') print('';'') loop_rec(6,4)

que se imprimirá:

0 1 2 3 4 5 6 7 8 ; 0 1 2 3 4 5 6 7 ; 0 1 2 3 4 5 6 ; 0 1 2 3 4 5 ;

o

def loop_rec(y, number): if (number > 1): loop_rec( y-1, number - 1 ) for i in range(y): print(i, end='' '') print('' ;'') else: for i in range(y): print(i, end='' '') print('';'') loop_rec(6,4)

que dará salida:

0 1 2 ; 0 1 2 3 ; 0 1 2 3 4 ; 0 1 2 3 4 5 ;

Una mejor variante que usa solo un bucle for (menos tipeo) es la siguiente:

def loop_rec(y, number): if (number >= 1): loop_rec( y+1, number - 1 ) for i in range(y): print(i, end='' '') print('''') else: return loop_rec(1,5)

dará salida:

0 1 2 3 4 0 1 2 3 0 1 2 0 1 0


No estoy claro por qué no puedes usar el producto de los límites y hacer

for x in range(y exp n)

donde n es el # de bucles .... Dices que exp exp será enorme, pero estoy seguro de que python puede manejarlo.

Sin embargo, dicho esto, ¿qué tal algún tipo de algoritmo recursivo?

def loop_rec(y, n): if n >= 1: for x in range(y): loop_rec(y, n - 1) else: whatever()


esto se puede hacer sin recursión usando itertools.product

import itertools def function(n): for x in itertools.product(range(n),repeat=n): whatever()