оценка логических операторов в операторе return в python - PullRequest
0 голосов
/ 19 мая 2010

Как это выполнить?

def f(x):
    return x>0 and (x%2)+f(x/2) or 0

x - это массив, например: [1, 1, 1, 3]

Ответы [ 4 ]

2 голосов
/ 19 мая 2010

Этот код не работает. Для начала, x>0 всегда верно. Но x%2 и x/2 дают ошибки типа.

0 голосов
/ 19 мая 2010

Функция рекурсивно подсчитывает количество единиц в двоичной форме числа x.

Каждый раз, когда функция добавляет суммы младшего бита (1 или 0) с количеством битов числа без последнего бита (деление на 2 похоже на смещение вправо на 1) или с 0, если битов больше нет .

Например: Функция вернет 2 для 5 в качестве входа (5 - 101 в двоичном виде) Функция вернет 3 для 13 в качестве входа (13 - 1101 в двоичном виде) ...

0 голосов
/ 19 мая 2010

оценка в return заявлении ничем не отличается от оценки в любом другом месте. если x является списком, то все это не имеет смысла и вызывает TypeError. x должно быть числовым, чтобы это работало.

Если x - это число, оно будет работать следующим образом:

  • оценить x>0 заявление
  • если это было True вернуть (x%2)+f(x/2) часть. Который, конечно, повторяется бесконечно
  • если это было False возврат 0
0 голосов
/ 19 мая 2010

Вы имели в виду это?

$ python
Python 2.5.5 (r255:77872, Apr 21 2010, 08:40:04) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(x):
...     return x>0 and (x%2)+f(x/2) or 0
... 
>>> f([1, 1, 1, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
TypeError: unsupported operand type(s) for %: 'list' and 'int'
...