有人可以找到递归函数func(int k)
的算法,仅在3^k
调用中返回n+1
,其中k
在[ 3^n, 3^(n+1) )
<范围内/ p>
例如,该函数应在1次调用中返回3^1
或3^2
,3^3
,3^4
,..
,3^8
in 2电话,3^9
,3^10
..在3个电话中等等。
答案 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次递归调用。