Algorithm 函数返回n+中的3^k;1个电话

Algorithm 函数返回n+中的3^k;1个电话,algorithm,recursion,Algorithm,Recursion,有人能帮我找到一个递归函数func(int k)的算法,只在n+1调用中返回3^k,其中k在范围[3^n,3^(n+1)] 例如,函数应该在1次调用中返回3^1或3^2,3^3,3^4,。,3^8在2次调用中,3^9,3^10。在3次调用中,依此类推。这里是未测试的C/C++: int 3pow(x) { switch(x) { case 1: return 3; case 2: return 9; case 3: return 2

有人能帮我找到一个递归函数
func(int k)
的算法,只在
n+1
调用中返回
3^k
,其中
k
在范围
[3^n,3^(n+1)]


例如,函数应该在1次调用中返回
3^1
3^2
3^3
3^4
3^8
在2次调用中,
3^9
3^10
。在3次调用中,依此类推。

这里是未测试的C/C++:

int 3pow(x)
{
    switch(x)
    {
        case 1: return 3;
        case 2: return 9;
        case 3: return 27;
    }

    int remain  = x % 3,
        recur   = 3pow((x-remain)/3),
        combine = recur * recur * recur;

    switch (remain)
    {
        case 0:  return combine;
        case 1:  return combine * 3;
        default: return combine * 9;
    }
}
我没有编译、运行或以其他方式测试此代码。可能存在语法错误和其他错误。但这足以让人明白这一点。

这个算法的不同之处在于,它是通过除以3而不是2来递归的。这个函数必然非常难看,因为抽象掉一些模式可能会涉及更多的递归。不过,这个算法现在是O(log3n)。下面是一个表,其中包含了给定的x(1-50)和所需的递归调用数(作为两元素lisp列表):


您可以看到,即使我们在超过100次时,也只需要4次递归调用。

以下是未经测试的C/C++中的算法:

int 3pow(x)
{
    switch(x)
    {
        case 1: return 3;
        case 2: return 9;
        case 3: return 27;
    }

    int remain  = x % 3,
        recur   = 3pow((x-remain)/3),
        combine = recur * recur * recur;

    switch (remain)
    {
        case 0:  return combine;
        case 1:  return combine * 3;
        default: return combine * 9;
    }
}
我没有编译、运行或以其他方式测试此代码。可能存在语法错误和其他错误。但这足以让人明白这一点。

这个算法的不同之处在于,它是通过除以3而不是2来递归的。这个函数必然非常难看,因为抽象掉一些模式可能会涉及更多的递归。不过,这个算法现在是O(log3n)。下面是一个表,其中包含了给定的x(1-50)和所需的递归调用数(作为两元素lisp列表):


你可以看到,即使我们起床超过100次,它也只需要4次递归调用。

嗯,3^8不允许9次调用而不是2次吗?嗯,3^8不允许9次调用而不是2次吗?f(2)不需要硬编码,它将遵循偶数规则并设置为f(1)*f(1)对于f(5),有三次调用,f(5),3*f(4),f(2)^2.我需要的是,对于n=3…8,调用应仅为2。f(2)不需要硬编码,它将遵循偶数规则并设置为f(1)*f(1)对于f(5),有三个调用,f(5),3*f(4),f(2)^2。我需要的是,对于n=3…8,调用应仅为2。