私の問題を説明するのは難しいです。
ネストされた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)の変数は、ネストされたコードでは実際には使用されません。
あなたの最初の考えは、番号引数のべきまでの範囲で、1つのforループを作成することかもしれません...
製品が巨大になるため、これは機能しません。 8つのネストされたforループが必要なインスタンスがあります。
積がforループの範囲に対して大きすぎます。
関数に渡す必要がある他の引数がありますが、私はそれを自分で処理できます。
これがコードです(Snowflake Fractalを作成します)
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
カメ
アイドル
Windows7
この問題は、再帰によって解決できます。これは一般的な問題になる可能性があると思うので、ここではアルゴリズムを作成しています。
function Recurse (y, number)
if (number > 1)
Recurse ( y, number - 1 )
else
for x in range (y)
whatever()
なぜあなたは境界の積を使うことができないのか分かりませんし、
for x in range(y exp n)
ここで、nはループの数です..。y exp nは巨大になると言いますが、pythonで処理できると確信しています。
しかし、そうは言っても、ある種の再帰的アルゴリズムはどうでしょうか?
def loop_rec(y, n):
if n >= 1:
for x in range(y):
loop_rec(y, n - 1)
else:
whatever()
これは、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]
Xrangeを検討しましたか?
for x in xrange(y ** n):
whatever()
また、xrange制限を超えた場合は、itertoolを使用できます
import itertools
for x in itertools.product(xrange(y), repeat=n):
whatever()
(以前のitertoolの回答では、範囲の代わりにyではなくnを誤って使用していました)
私の返信は遅れていますが、複数のループを実行したいとします。一部の範囲を複数回印刷します。次に、この再帰の正しいバージョンは次のとおりです。
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)
これにより、range(4)で3つのforループが作成されます
ダイナミックレンジをいじりたい場合は、いくつかのバリエーションがあります。
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)
印刷されます:
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 ;
または
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)
出力されます:
0 1 2 ;
0 1 2 3 ;
0 1 2 3 4 ;
0 1 2 3 4 5 ;
Forループを1つだけ使用する(タイピングが少ない)より良いバリアントは次のとおりです。
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)
出力されます:
0 1 2 3 4
0 1 2 3
0 1 2
0 1
0