数字尾递归的强大功能

时间:2018-02-17 04:47:33

标签: python recursion data-structures tail-recursion

我正在尝试使用尾递归计算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)

4 个答案:

答案 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)

递归函数称为尾递归,如果递归是递归函数中要执行的最后一条语句。在计算 xn (x^n) 次方的情况下,正常的递归函数可能会将所有值存储在 Stack 中,直到它达到 n == 1n == 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);
}