Python 包含递归和两个内部for循环的增长阶

Python 包含递归和两个内部for循环的增长阶,python,recursion,runtime,Python,Recursion,Runtime,我试图回答以下问题,但我不确定我是否正确。我已经得出结论,它是n^2函数的一个大θ。我的推理是,i和j的内部2个循环相当于一个运算序列,0,1,2,3,4,5…x-1,可以通过算术运算转换为(x*x-1)/2。然而,外部递归调用让我有些困惑。我很想把外部递归调用看作另一个while循环,但我拒绝了它,因为它不完全是另一个while循环或for循环,因为x也会改变。有人能帮我更好地理解下面的问题吗 def foo(x): if x < 1:

我试图回答以下问题,但我不确定我是否正确。我已经得出结论,它是n^2函数的一个大θ。我的推理是,i和j的内部2个循环相当于一个运算序列,0,1,2,3,4,5…x-1,可以通过算术运算转换为(x*x-1)/2。然而,外部递归调用让我有些困惑。我很想把外部递归调用看作另一个while循环,但我拒绝了它,因为它不完全是另一个while循环或for循环,因为x也会改变。有人能帮我更好地理解下面的问题吗

    def foo(x):
        if x < 1: 
            return 'boo'
        for i in range(x): 
            for j in range(i):
                return foo(i + j)
        return foo(x-1)
def foo(x):
如果x<1:
返回“boo”
对于范围(x)内的i:
对于范围(i)中的j:
返回foo(i+j)
返回foo(x-1)
修订版:我刚刚通过python解释器运行了这段代码,结果证明它将是常量时间,因为这是一个技巧性问题。原因是,return语句将只计算为foo(1),然后输出'boo',无论n的大小如何

但是-->如果我将我的代码更改为以下内容,该怎么办。运行时现在是θ(n^2)还是θ(n^3)

def foo(x):
如果x<1:
返回“boo”
对于范围(x)内的i:
对于范围(i)中的j:
打印(i+j)
返回foo(x-1)

编辑:首先有问题的是
i+i
,但现在有
i+j
,所以现在我的答案是错误的


x<1
时,它会打印“boo”-没有什么有趣的东西

x>=1
时,可以到达循环

for i in range(x): 
    for j in range(i):
        return foo(i+i)
因此,让
x=1
得到

for i in range(1): 
    for j in range(i):
        return foo(i+i)
所以让i=0,你就有了

    for j in range(0):
    for j in range(1):
而且它会运行

所以让i=1,你就有了

    for j in range(0):
    for j in range(1):
对于
j=0
,您可以运行

    return foo(2)
然后返回到该描述的开头。
您将再次获得
return foo(2)
。自己检查一下

因此,对于'x>=1',您总是得到
返回foo(2)

因此,您可以将此代码简化为

def foo(x):
    if x < 1: 
        return 'boo'
    return foo(2)
def foo(x):
如果x<1:
返回“boo”
返回foo(2)
(您将永远无法到达
返回foo(x-1)

你有无限的功能


(我希望我是对的)

请分享示例输入和所需的outputinside 2内部循环是
return
,因此我认为您可以将两个循环都减少到
return foo(2)
,并且它从不停止。您是否尝试过与@AlbertRothman一起分析它?您如何将master方法应用于此问题?@cy.serenity。当您进行n-1个递归调用并在调用之外进行二次工作时,它是n^3。同样,您的第一个函数也不会立即返回,在0-1的外部for you循环中,考虑到x大于1,在内部循环中,第一个迭代位上不会发生任何事情,第二个迭代位也是从
return foo(i+j)->return foo(1)
,然后您将其转换为
return foo(x-1)->return foo(0)
,你到达你的基本情况并返回。不。第二个循环迭代实际上是i=0,j=1,但这会调用foo(1),而不是foo(2)。foo(1)下降到final语句,返回'boo'。正如OP现在所承认的,这是恒定的时间。请参阅@Padraic Cunningham在评论中的精彩解释。@Prune我检查了之前有
I+I
的问题。现在是
i+j
,所以我的答案是错的。