2016-12-29 12 views
0

私はネストしたタプルとフラットリストを生成する問題に対処しようとしていました。私はこの関数(n_iter)によって実行される最大反復回数を取得したかったのです。私は一見、 "and"演算子を利用して問題を解決しましたが、 "、"私の呼び出しの間には、最初の関数に戻ります。さらに、これは著しく速く機能しています。誰でもこの論理が働いた理由を知っていますか? "and"が現れる評価と関係がありますか?これは宿題のためのものだが、私はそれに答えているようだ。Pythonの再帰的な "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 
+0

質問が不明です!あなたは何をしようとしていますか?私はあなたの関数に渡す価値が何であれ、その値から2を引いてあなたのコードで達成したいものを返します。あなたとその出力を簡単に説明してください。 –

+0

'と'は何をしていると思いますか?それは間違っています。 – user2357112

+0

私のコードは、2人のプレイヤーが2で割り、1を引くことができるゲームでプレイヤーが利用できる最大のプレイ数を決定することを意図しています。そして、ネストされたタプルから "最大"値を返しています。 – CalTex

答えて

0

です。理由は、andが「短編」です。 <expr-1>の結果が「falsy」である場合

<expr-1> and <expr-2> 

に発現<expr-2>(すなわち、それが論理的文脈においてFalse考えられる)を評価することはできません。 n=8分割して呼び出す例えばあなたのケースで

その代わりに減算(1/2入力が整数である場合0であり、Pythonの2)

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

ある

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

n=0は「偽」ですが、除算よりも除算でははるかに高速に到達することができます。これは、あなたが最初の部門に確認している場合だけにして減算して呼の数ははるかに小さくなることを意味します。大きな入力を持つ

# 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が0に到達するために256回の減算が必要ですが、わずか8つの部門)。

+0

素晴らしい!本当に説明を感謝します!完全に意味をなさない私に教えるために時間を割いていただきありがとうございます! – CalTex

関連する問題