使用递归将指数基数增加到指数

时间:2015-04-23 17:48:31

标签: python python-3.x recursion

我目前正在尝试使用递归将基数提高到2的幂,然后用指数提升,所以它看起来像x^2^y

这是我的代码:

def real_multiply(x:int, y:int):
    if y == 0:
        return x
    else:
        return x * real_multiply(x,(2**y)-1)

基本案例y==02^0返回1,输出最终为x^1,这将返回x。但是,当我运行此代码时,它会进入递归限制。

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

我不明白你在递归中做了什么,但这是一个典型的取幂函数:

def power(x, y):
    if y == 1:
        return x

    if y != 1:
        return x * power(x, y - 1)

答案 1 :(得分:2)

答案已经在这里了。

来自@MalikBrahimi

def power(x, y):
    if y == 1:
        return x

    if y != 1:
        return x * power(x, y - 1)

来自@JacobMcCarthy

In [5]: x = 2

In [6]: y = 4

In [7]: power(x, power(2, y))
Out[7]: 65536

In [8]: x ** 2 ** y
Out[8]: 65536

OP可能会说,"不,我需要一个仅以xy为参数的函数。 OK:

def super_power(x, y):
    return power(x, power(2, y))

答案 2 :(得分:1)

使用Malik Brahimi的回答你可以写一个电源功能然后让你的初始呼叫为电源(x,电源(2,y))。

答案 3 :(得分:1)

你的递归有点过了。由于2 y = 2 * 2 y-1 ,你有x 2 y = x 2 * x 2 y-1 。因此,您的递归应该是

if y == 1:
    return x * x
else:
    # return x**2 * real_multiply(x, 2**(y-1))
    return x * 2 * real_multiply(x, real_multiply(2, y-1))

(在这里,我完全避免使用**。嵌套递归!)

答案 4 :(得分:0)

这里和其他类似问题下的答案都没有考虑指数为负时的情况。

这是一个可行的解决方案:

def power(base, exponent):
    if base == 0:
        if exponent == 0:
            return 1.0 # 0 ^ 0 is undefined. Using 1.
        else:
            return 0
        
    if exponent == 0:
        return 1

    dbl_power = base * power(base, abs(exponent) - 1)

    # if exponent is negative, take reciprocal
    if exponent < 0:
        dbl_power = 1 / dbl_power

    return dbl_power