函数在n + 1次调用中返回3 ^ k

时间:2009-07-20 04:49:02

标签: algorithm recursion

有人可以找到递归函数func(int k)的算法,仅在3^k调用中返回n+1,其中k[ 3^n, 3^(n+1) ) <范围内/ p>

例如,该函数应在1次调用中返回3^13^23^33^4..3^8 in 2电话,3^93^10 ..在3个电话中等等。

1 个答案:

答案 0 :(得分:5)

以下是未经测试 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(log 3 n)。这是一个来自1-50的给定x的表和所需的递归调用的数量(作为一个双元素的lisp列表):

(1  1) (2  1) (3  1) (4  2) (5  2) (6  2) (7  2) (8  2) (9  2) (10 2)
(11 2) (12 3) (13 3) (14 3) (15 3) (16 3) (17 3) (18 3) (19 3) (20 3)
(21 3) (22 3) (23 3) (24 3) (25 3) (26 3) (27 3) (28 3) (29 3) (30 3)
(31 3) (32 3) (33 3) (34 3) (35 3) (36 4) (37 4) (38 4) (39 4) (40 4)
(41 4) (42 4) (43 4) (44 4) (45 4) (46 4) (47 4) (48 4) (49 4) (50 4)
(51 4) (52 4) (53 4) (54 4) (55 4) (56 4) (57 4) (58 4) (59 4) (60 4)
(61 4) (62 4) (63 4) (64 4) (65 4) (66 4) (67 4) (68 4) (69 4) (70 4)
(71 4) (72 4) (73 4) (74 4) (75 4) (76 4) (77 4) (78 4) (79 4) (80 4)
(81 4) (82 4) (83 4) (84 4) (85 4) (86 4) (87 4) (88 4) (89 4) (90 4)
(91 4) (92 4) (93 4) (94 4) (95 4) (96 4) (97 4) (98 4) (99 4) (100 4)

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