Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 标尺函数(1,2,1,3,1,2,1,4,1,2,1,3,…)的迭代实现_Python_Algorithm_Number Theory - Fatal编程技术网

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

Python 标尺函数(1,2,1,3,1,2,1,4,1,2,1,3,…)的迭代实现,python,algorithm,number-theory,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 对于每个数字n,标尺(n)等于1+(二进制n中尾随0的数量) 我认为(这个未经测试的)它可以像 def ruler(n): return (x ^ (x - 1)).bit_length() 因为在

什么是的迭代实现

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

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

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

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

我认为(这个未经测试的)它可以像

def ruler(n):
    return (x ^ (x - 1)).bit_length()
因为在二进制中,尾随数字看起来像

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

然后你需要1的数量,这给了你。

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

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

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

按照休·博思韦尔的话,你可以做以下事情(对于
n>0
):


查找表和位旋转可以让您高效地解决此问题

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

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

ruler=dict((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”

用于“5”


我在那里找不到这个程序。你能显示准确的位置吗?而且,
标尺的递归没有基本情况?!@thefourtheye我认为基本情况隐含在对
范围的调用中,因为当
I-1
变为零时,你有一个空范围。@Two-bitalchester哦,是的。谢谢你指出:-)伙计,太棒了:-)你是怎么得到这个的?这是一个很好的硬件方法(我知道
x^(x-1)
x&(x-1)
位旋转黑客),但是
位长度()。(可能不是在Python中,而是在其他语言中)在C中,这只是
ffs(n)
,它返回
n
中最低有效集位的位位置。(gcc还提供ffsl和ffsll用于更长的字长。)。当你可以循环时,永远不要递归。那只测试一个输入;递归版本中的标尺(k)是2k-1值的生成器。大小为O(N)的查找表具有时间效率,但不具有空间效率。@JasonS该表的大小为O(logn)。它中的63个元素在18446744073709551616之前对N有效。哦,好吧,不知怎么的,我错过了。
#!/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()
1234567890----1234567890----1234567890----1234567890----1234567890----1234567890----1234567890----1234567890----
12345678901234567880--12345678901234567880--12345678901234567880--12345678901234567880--12345678901234567880--