2016-12-29 8 views
0

Я пытался решить проблему создания вложенных кортежей против плоских списков. Я хотел получить максимальное количество итераций, выполняемых этой функцией (n_iter). Я, похоже, решил проблему с использованием оператора «и» против «,» между моими обратными вызовами к первоначальным функциям. Кроме того, это работает значительно быстрее. Кто-нибудь знает, почему эта логика сработала? Это связано с оценкой, где появляется «и»? Полное раскрытие этого было для домашнего задания, но я, кажется, ответил на него.Рекурсивная «и» функциональность 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 является «ложным», но может быть достигнуто гораздо быстрее с делением, чем с вычитанием. Это означает, что если вы первый чек с делением и только затем с вычитанием число вызовов будет намного меньше:

# 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

Смежные вопросы