我试图处理生成嵌套元组与平面列表的问题。我想获得此函数(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
答案 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次)。