递归函数

学习目标

1、掌握递归函数的使用。

2、理解尾递归优化。

递归函数

在函数内部可以调用其他函数,如果函数内部调用自身,则这个函数就是递归函数。

计算阶乘n!=1x2x3x...x(n-1)xn,用fact(n)表示

fact(n)=n!=1x2x3x...x(n-1)xn=(n-1)!xn=fact(n-1)xn

因此fact(n)=nxfact(n-1)

def fact(n):

    if n==1 :

        return 1

    return n * fact(n-1)

print(fact(5))

print(fact(100))

print(fact(1000)) #栈溢出

执行结果

递归函数的优点是定义简单、逻辑清晰,但是使用递归函数需要注意防止栈溢出。解决递归调用栈溢出的方法是尾递归优化,尾递归是指函数返回时调用本身且return语句不能包含表达式。

尾递归如果做了优化时,栈不会增长,所以无论调多少次都不会出现栈溢出的问题。

上面的fact(n)函数返回return n*fact(n-1)引入了乘法表达式,就不是尾递归。

def fact(n) :

    return fact_iter(n, 1)

def fact_iter(num, product) :

    if num==1 :

        return product

    return fact_iter(num-1, num * product)

print(fact(5))

print(fact(100))

print(fact(1000)) #栈溢出

执行结果

Python标准的解释器没有针对尾递归做优化,所以任何递归函数都存在栈溢出的问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n!...
    Aedda阅读 2,383评论 0 0
  • 一、lambda函数 lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函...
    花间派I风月阅读 4,702评论 0 3
  • 题目: 计算阶乘n!=n*(n-1)*(n-2)*…3*2*1 用递归函数来表示为: def f(x): if ...
    kevin282阅读 6,682评论 0 2
  • http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958...
    喵在野阅读 3,408评论 0 4
  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n!...
    Zhigang_Han阅读 4,210评论 0 0

友情链接更多精彩内容