一日一技:如何用递归函数写出2**n - 1?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一日一技:如何用递归函数写出2**n - 1?相关的知识,希望对你有一定的参考价值。

一日一技:如何用递归函数写出2**n - 1?

技术图片

摄影:产品经理
实验室的年会下午茶
已知 n 为正整数,写一个递归函数计算。

在 Python 里面要计算非常简单:


>>> def calc(n):
...  return 2 ** n - 1
...
>>> calc(10)
1023

运行效果如下图所示:

技术图片
现在,需要写一个递归函数来计算的值。

如果要计算,那么这个递归函数非常简单:

def calc(n):
    if n > 0:
        return 2 * calc(n - 1)
    else:
        return 1

现在的问题是,如何把-1放到这个函数里面去?

可能有同学想到一个比较贱的方法,就是在函数里面再定义一个函数:

def calc(n):
    def power(n):
        if n > 0:
            return 2 * power(n - 1)
        else:
            return 1
    return power(n) - 1

然而,这种方法实际上并不满足题意。虽然power是一个递归函数,但是calc只是普通函数。

那有没有更好的办法来计算呢?

考虑到.同时,所以我们可以把函数改写为:

def calc(n):
    if n == 1:
        return 1
    else:
        return 1 + 2 * calc(n - 1)

运行效果如下图所示:

技术图片
技术图片

以上是关于一日一技:如何用递归函数写出2**n - 1?的主要内容,如果未能解决你的问题,请参考以下文章

一日一技:如何把多层嵌套的列表展平

如何用递归解决斐波那契数列

一日一技:在 Python 中实现函数重载

一日一技:实现函数调用结果的 LRU 缓存

一日一技:隐患——redis-py的blpop可能由于网络波动导致收不到信息

一日一技:Python读取包里面的数据文件的三种方法