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

时间:2015-03-13 01:55:16

标签: python algorithm number-theory

什么是ruler function

的迭代实现

This website断言“可以非递归地生成标尺函数”,但从不显示示例。

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

def ruler(k):
  for i in range(1, k+1):
    yield i
    for x in ruler(i-1): yield x

5 个答案:

答案 0 :(得分:6)

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

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

def ruler(n):
    return (x ^ (x - 1)).bit_length()

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

...mno1000    # x
...mno0111    # x - 1
...0001111    # x XOR (x - 1)

然后你需要1 {1}的数量,.bit_length()给你。

答案 1 :(得分:4)

我可能在这里遗漏了一些东西,但是基于标尺函数的描述......

def ruler(k):
    pow = 1
    while ((2*k) % (2**pow)) == 0:
        pow += 1
    return pow-1

for x in range(1, 10):
     print ruler(x)

1
2
1
3
1
2
1
4
1

Dunno,也许我不理解这个问题。

答案 2 :(得分:2)

查找表和bit-twiddling让您有效地解决这个问题。

ruler = dict((1<<i, i+1) for i in xrange(63))

for i in xrange(1, 20):
    print ruler[i & ~(i-1)],

答案 3 :(得分:0)

使用Hugh Bothwell所说的,您可以执行以下操作(对于n > 0):

def ruler(n):
  return len(bin(n).split('1')[-1]) + 1

答案 4 :(得分:-1)

我正在尝试这个问题并使用一些旧方法。请检查一次。我还没有完全设置好它。但显然它正在工作。那里几乎没有未完成的破损代码。

提前道歉。

#!/usr/bin/env python
import os
def ruler():
    print("Initiating ruler function...")
    num = int(input("Enter the value to Eval::  "))

    expNumrange = 1234567890

    if num%2 == 0:
        for i in range(num):
            print(expNumrange,end='----')

    else:
        rem = num%2
        remLen = len(str(abs(rem)))
        expNumrangelen = len(str(abs(expNumrange)))
        finval = len(str(abs(expNumrange - remLen)))
        setVal = expNumrange - finval
        #rem2 = (str(expNumrange) - str(remLen))
        for i in range(num):
            print(expNumrange, end=(str(setVal) + '--'))



if __name__ == '__main__':
    ruler()

现在,请检查输出。

对于“ 8”

1234567890----1234567890----1234567890----1234567890----1234567890----1234567890----1234567890----1234567890----

对于“ 5”

12345678901234567880--12345678901234567880--12345678901234567880--12345678901234567880--12345678901234567880--