Python递归“和”功能?

2024-04-23 07:31:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图处理生成嵌套元组和平面列表的问题。我想得到这个函数执行的最大迭代次数(niter)。我似乎通过在回拨到初始函数之间使用“and”操作符vs.a“,”解决了这个问题。此外,它的运行速度非常快。有人知道这个逻辑为什么起作用吗?它是否与“and”出现的位置有关?这是一个家庭作业,但我似乎已经回答了

#n_iter should start as zero
def break_it_down(n, n_iter):
    if n > 2:
        division, subtraction = n/2.0, n-1.0
        n_iter +=1
        return break_it_down(division,n_iter) and break_it_down(subtraction, n_iter)
    return n_iter

Tags: and函数列表returnit次数平面division
1条回答
网友
1楼 · 发布于 2024-04-23 07:31:03

原因是and是“短循环”。在

<expr-1> and <expr-2>

如果<expr-1>的结果是“falsy”(即在逻辑上下文中它被认为是False),则表达式<expr-2>将不被计算

例如,用n=8除法调用

n=4 → n=2 → n=1 -> n=0

(在python2中,当输入是整数时,1/2是0)

而不是减法

n=8 → n=7 → n=6 → n=5 → n=4 → n=3 → n=2 → n=1 → n=0

n=0是“falsy”,但用除法得到的速度比用减法要快得多。这意味着,如果先用除法检查,然后再用减法检查,则调用的次数将少得多:

# division first
n=8
n=8/2=4 and n=8-1=7
n=4/2=2 and n=4-1=3
n=2/2=1 and n=2-1=1
n=1/2=0 and n=1-1=0 (stop)

# subtraction first
n=8
n=8-1=7 and n=8/2=4
n=7-1=6 and n=7/2=3
n=6-1=5 and n=6/2=3
n=5-1=4 and n=5/2=2
n=4-1=3 and n=4/2=2
n=3-1=2 and n=3/2=1
n=2-1=1 and n=2/2=1
n=1-1=0 and n=1/2=0 (stop)

输入越大,差异就越大(例如256需要256次减法才能得到0,但只有8次除法)

相关问题 更多 >