Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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
C++ 给定递归表达式,求空间复杂度为O(1)的算法_C++_Algorithm_Recursion - Fatal编程技术网

C++ 给定递归表达式,求空间复杂度为O(1)的算法

C++ 给定递归表达式,求空间复杂度为O(1)的算法,c++,algorithm,recursion,C++,Algorithm,Recursion,我的任务是根据以下简单表达式编写一个算法: f (0) = 0, f (1) = 1, f (2n) = f (n), f (2n + 1) = f (n) + f (n + 1). 这些限制是:时间复杂度O(logn),空间复杂度O(1)。 我编写了这个基本的递归函数: int func (int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } if (n

我的任务是根据以下简单表达式编写一个算法:

f (0) = 0, f (1) = 1, f (2n) = f (n), f (2n + 1) = f (n) + f (n + 1).
这些限制是:时间复杂度O(logn),空间复杂度O(1)。 我编写了这个基本的递归函数:

int func (int n) {
    if (n == 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    }
    if (n % 2 == 0) {
        return func(n / 2);
    } else {
        return func(n / 2) + func((n / 2) + 1);
    }
}

使用迭代算法可能会有更聪明的方法,因为我需要O(1)空间复杂性(因为递归调用,我认为我的代码不是O(1)空间)。

此序列是Stern的双原子序列,您得到的函数称为
fusc(n)

计算O(logn)时间和O(1)空间复杂度的一种方法是在Calkin-Wilf树中找到第n个值。该值的分子将是
fusc(n)
。您可以在维基百科页面上阅读一些背景资料:

下面是一些代码,用于检查快速版本的幼稚
fusc
实现。它是在Python中,但是转换成C++是微不足道的。
def fusc(n):
    if n < 2:
        return n
    if n%2 == 0:
        return fusc(n//2)
    return fusc(n//2) + fusc(n//2+1)


def fast_fusc(n):
    if n == 0: return 0
    top = 1
    while top <= n:
        top <<= 1
    top >>= 1
    a, b = 1, 1
    while top > 1:
        top >>= 1
        if n & top:
            a, b = a + b, b
        else:
            a, b = a, a + b
    return a


for i in xrange(100):
    assert fusc(i) == fast_fusc(i)
def fusc(n):
如果n<2:
返回n
如果n%2==0:
返回fusc(n//2)
返回fusc(n//2)+fusc(n//2+1)
def fast_fusc(n):
如果n==0:返回0
top=1
而前1名:
顶部>>=1
如果不在顶部(&T):
a、 b=a+b,b
其他:
a、 b=a,a+b
归还
对于X范围内的i(100):
断言fusc(i)=fast\u fusc(i)

您可以看到,在
fast\u fusc
中,
top
迭代
n
的位,因此代码执行O(logn)算术运算。因为只使用了4个变量(
n
a
b
top
),所以它使用了O(1)空间。

注意,对于偶数参数,可以将其除以2,直到奇数为止,然后才调用函数。对奇数参数应用相同的逻辑。我回答的可能是重复的,但随后搜索重复并找到了一个。请注意,公认的答案很差,但提供的解决方案比我的简单一点。