我正在尝试使用尾递归计算num的幂,运行时间为log(n)。据我所知,使用功率// 2而不是功率-1之间的区别是减少运行时间。因此,当我计算该值时,我需要将旧值乘以另外两个和而不是一个。我的代码可以找到,直到达到power_of(2,6)
def power_of(num,power,value = 1):
if power == 0:
return 1
elif power == 1:
return value
elif power % 2 != 0:
return power_of(num, power // 2 , value * num * num * num)
else:
return power_of(num, power // 2 , value * num * num)
power_of(2,6)
答案 0 :(得分:1)
好的尾递归,对吧。我对另一个答案感到抱歉。您的方法应该有效,只需要进行一些修改。对于evens,您希望将num替换为num * num,并将值保留为值。对于赔率,您希望将num替换为num * num,将值* num替换为值,并在分割幂之前减去1.
1,3,5,
我几乎从wikipedia
复制了这些内容答案 1 :(得分:0)
https://repl.it/repls/WiltedOrnateMetadata
主要问题是你的尾值不足。说功率= 9,功率// 2 = 4,功率 - 功率// 2 = 5,你只需要乘以值* num ^ 3.让我知道这是否有意义。
此外,你有一个power == 1的问题,如果值为1,则返回num。
def power_of(num,power,value = 1):
print ("power_of({},{},{})".format(num,power,value)) # this was how I debugged it
if power == 0:
return 1
elif power == 1:
return num if value == 1 else value
elif power % 2 != 0:
for a in range(1, power - power // 2):
value *= num
return power_of(num, power // 2 , value)
else:
for a in range(1, power - power // 2):
value *= num
return power_of(num, power // 2 , value * num * num)
输出:
print(power_of(2,9))
power_of(2,9,1)
power_of(2,4,16)
power_of(2,2,128)
power_of(2,1,512)
512
答案 2 :(得分:0)
了解其工作原理:
try...except
答案 3 :(得分:0)
递归函数称为尾递归,如果递归是递归函数中要执行的最后一条语句。在计算 x
的 n (x^n)
次方的情况下,正常的递归函数可能会将所有值存储在 Stack 中,直到它达到 n == 1
或 n == 0
(根据您的基本条件)而我们不想使用所有这些状态/实例。因此,我们可以做的是将最新状态保存在变量中,并在达到基本情况时立即返回该变量。
int x = scanner.nextInt();
int n = scanner.nextInt();
int res = printPower(x, n);
int resTail = printPowerTail (x, n, x);
System.out.println(res);
System.out.println(resTail);
static int printPower (int x, int n) {
if (n == 1)
return x;
if (n == 0)
return 1;
return x * printPower(x, n - 1); // this call will store all the instances of n till n == 1
}
static int printPowerTail (int x, int n, int flag) {
if (n == 1)
return flag;
if (n == 0)
return 1;
return printPowerTail(x, n - 1, flag * x);
}