标尺函数的迭代实现(1,2,1,3,1,2,1,4,1,2,1,3,...)

Jas*_*n S 2 python algorithm number-theory

什么是标尺函数的迭代实现?

该网站声称"标尺函数可以非递归地生成",但从未显示示例.

Python中的递归实现(来自同一网页)如下所示:

def ruler(k):
  for i in range(1, k+1):
    yield i
    for x in ruler(i-1): yield x
Run Code Online (Sandbox Code Playgroud)

Hug*_*ell 6

对于每个数字n,ruler(n)等于1 +(二进制n中的尾随0的数量).

我认为(这是未经测试的)它可以有效地实现

def ruler(n):
    return (x ^ (x - 1)).bit_length()
Run Code Online (Sandbox Code Playgroud)

因为在二进制中,拖尾数字看起来像

...mno1000    # x
...mno0111    # x - 1
...0001111    # x XOR (x - 1)
Run Code Online (Sandbox Code Playgroud)

那么你想要1s的数量,这.bit_length()给你.