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

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

摄影:产品经理实验室的年会下午茶

已知 n 为正整数,写一个递归函数计算。

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

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

运行效果如下图所示:

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

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

def calc(n):
    if n > 0:
        return2 * calc(n - 1)
    else:
        return1

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

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

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

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

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

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

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

运行效果如下图所示:

目录
相关文章
|
4月前
什么是递归函数?怎样实现递归?
什么是递归函数?怎样实现递归?
|
4月前
|
Python
Python实现递归的方式来生成斐波那契数列
Python实现递归的方式来生成斐波那契数列
|
11月前
|
缓存 算法 搜索推荐
递归函数就这么简单!通俗的Go语言递归指南
递归函数就这么简单!通俗的Go语言递归指南
80 0
|
3月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
67 7
|
2月前
|
存储 算法 程序员
C语言编程—递归
递归是函数自我调用的编程技术,常用于解决分治问题,如计算阶乘和斐波那契数列。示例中展示了C语言的阶乘和斐波那契数列递归实现。递归需满足:问题可转化为规模更小的同类问题,存在结束条件以防止无限循环,并可能消耗大量时间和栈空间。栈用于存储函数调用信息,过多递归可能导致栈溢出。递归虽简洁,但非最优效率选择,递推算法通常是更好的替代方案。
37 0
|
3月前
|
C语言
C语言学习记录——用递归思想求第n个斐波那契数,函数递归
C语言学习记录——用递归思想求第n个斐波那契数,函数递归
23 0
|
4月前
|
算法 API Python
递归函数:原理与实践
递归函数:原理与实践
|
4月前
|
机器学习/深度学习 算法
加深理解函数递归
加深理解函数递归
31 0
|
4月前
|
Python
python实现斐波那契数列案例代码
python实现斐波那契数列递归实现斐波那契数列:
44 0
|
4月前
|
机器学习/深度学习
20004.C语言编程基础(0001)- 递归法求阶乘
20004.C语言编程基础(0001)- 递归法求阶乘
58 0