これはどのように実行されますか?
def f(x):
return x>0 and (x%2)+f(x/2) or 0
x
たとえば、配列です。[1, 1, 1, 3]
これはどのように実行されますか?
def f(x):
return x>0 and (x%2)+f(x/2) or 0
x
たとえば、配列です。[1, 1, 1, 3]
このコードは壊れています。まず、x>0
常に true です。しかしx%2
、x/2
型エラーが発生します。
これのことですか?
$ 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'
return
ステートメントでの評価は、他の場所での評価と何ら変わりはありません。ifx
がリストの場合、この全体が意味をなさず、 が発生しTypeError
ます。x
これが機能するには、数値でなければなりません。
が数値の場合x
、次のように機能します。
x>0
ステートメントを評価するTrue
リターン(x%2)+f(x/2)
パーツの場合。もちろん、これは無限に再帰しますFalse
リターンだったら0
この関数は、数値 x のバイナリ形式で 1 の数を再帰的にカウントします。
関数が追加するたびに、最下位ビット (1 または 0) と、最後のビットのない数のビット カウント (2 で割ることは、1 だけ右にシフトするようなもの) を合計するか、それ以上ビットがない場合は 0 と合計します。
例: 関数は入力として 5 に対して 2 を返します (5 は 2 進数で 101 です) 関数は入力として 13 に対して 3 を返します (13 は 2 進数で 1101 です) ...