2016-12-29 78 views
0

我试图处理生成嵌套元组与平面列表的问题。我想获得该函数执行的最大迭代次数(n_iter)。我似乎通过利用“和”运算符来解决这个问题,而在我的回调函数与初始函数之间使用“,”来解决这个问题。另外,这个功能运行得非常快。任何人都知道为什么这个逻辑有效它是否与“and”出现的评估有关?完全披露这是为了做家庭作业,但我似乎已经回答了。Python递归“和”功能?

#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

你的问题不清楚!你在做什么?我传递给你的函数的价值是什么,它将返回值减去2.你想用你的代码实现什么。请简要解释你的和它的输出。 –

+0

你认为'和'在做什么?它看起来错了。 – user2357112

+0

因此,我的代码旨在确定游戏中玩家可以玩的最大数量,其中两个玩家可以选择将数字除以2或减1.此和从嵌套元组返回“max”值。 – CalTex

回答

0

原因是and是“短cirtuiting”。在

<expr-1> and <expr-2> 

表达<expr-2>不会被评估如果<expr-1>结果是“falsy”(即,它是在逻辑上下文考虑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是“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个师)。

+0

太棒了!真的很感谢解释!总体感觉。欣赏花时间教我! – CalTex