Python递归“和”功能?

时间:2016-12-29 06:36:58

标签: python recursion operators

我试图处理生成嵌套元组与平面列表的问题。我想获得此函数(n_iter)执行的最大迭代次数。我似乎在回调到初始函数之间利用“和”运算符与“,”来解决问题。此外,这功能明显更快。有谁知道为什么这个逻辑有效?是否与“和”出现的评估有关?完全披露这是一个家庭作业,但我似乎已经回答了它。

#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

1 个答案:

答案 0 :(得分:0)

原因是and是"短暂的cirtuiting"。在

<expr-1> and <expr-2>

如果<expr-2>的结果为&#34; falsy&#34;则不会评估表达式<expr-1> (即在逻辑上下文中将其视为False。)

在您的情况下,例如使用n=8分部进行呼叫

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

(在Python 2中,当输入为整数时,1/2为0)

而是减法

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

n=0是&#34; falsy&#34;但是通过除法可以比使用减法更快地达到。这意味着如果您首先使用除法进行检查,然后只进行减法检查,则呼叫次数将会小得多:

# 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次)。