45

私の問題を説明するのは難しいです。

ネストされた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ループの範囲に対して大きすぎます。

関数に渡す必要のある引数は他にもありますが、私はそれを自分で処理できます。

これがコードです(スノーフレークフラクタルを作成します)

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
Turtle
IDLE
Windows7

4

8 に答える 8

46

境界の積を使用できない理由がわかりません。

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()
于 2011-08-25T07:28:47.893 に答える
27

この問題は再帰によって解決できます。これは一般的な問題である可能性があると考えているため、ここでアルゴリズムを書いているだけです。

function Recurse (y, number) 
   if (number > 1)
      Recurse ( y, number - 1 )
   else
      for x in range (y)
      whatever()
于 2011-08-25T07:32:11.787 に答える
7

再帰が最善の策です。基本ケースと再帰ケースで何をすべきかを検討してください。

リクエストに応じて、コードは除外されました。

于 2011-08-25T07:27:57.943 に答える
6

どうぞ。範囲を範囲とし、必要に応じて結果を操作します。

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]
于 2011-08-25T08:52:43.150 に答える
1

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が誤って使用されていました)

于 2011-08-25T10:12:19.923 に答える
0

返信が遅くなりましたが、たとえばある範囲を複数回出力するなど、複数のループを実行したいとします。この再帰の正しいバージョンは次のとおりです。

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 
于 2016-10-03T18:50:58.573 に答える