具有可变数量For循环的函数(python)

50 投票
8 回答
49442 浏览
提问于 2025-04-17 00:19

我的问题有点难以解释。

我想创建一个函数,这个函数里面有嵌套的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
Turtle
IDLE
Windows7

8 个回答

8

递归是解决这个问题的最佳方法。想想在基本情况下应该做什么,以及在递归情况下应该做什么。

根据要求,代码部分没有提供。

51

我不太明白为什么不能用边界的乘积来做

for x in range(y exp n)

这里的n是循环的次数……你说y的指数n会很大,但我相信Python是可以处理的。

不过,既然这样,那有没有什么递归算法可以用呢?

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

这个问题可以通过递归来解决。我在这里写一个算法,因为我认为这可能是一个普遍的问题。

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

撰写回答