page contents

9个极简代码,彻底理解Python递归函数!

本文讲述了9个极简代码,彻底理解python递归函数!具有很好的参考价值,希望对大家有所帮助。一起跟随好学星城小编过来看看吧,具体如下:

attachments-2024-03-TGrO2R1S65e80a0644d77.png本文讲述了9个极简代码,彻底理解python递归函数!具有很好的参考价值,希望对大家有所帮助。一起跟随好学星城小编过来看看吧,具体如下:

递归是一种强大的编程技巧,通过函数调用自身来解决问题。在Python中,递归可以简化代码,特别是在处理那些自然具有递归性质的问题时,如数据结构的遍历和某些算法的实现。

本文将深入探讨递归函数的应用、性能影响、优化技巧,并通过具体的代码示例说明如何高效地使用递归。

一、递归函数基础

递归函数由两个主要部分组成:基本情况和递归情况。基本情况是递归停止的条件,而递归情况则是函数调用自身以解决子问题的部分。

示例:斐波那契数列

def fibonacci(n):

    if n <= 1:

        return n

    else:

        return fibonacci(n-1) + fibonacci(n-2)

# 使用示例

print(fibonacci(10))

# 输出: 55

这个例子展示了递归的直观应用,但也揭示了其性能问题:重复计算。

二、性能考量与优化

递归虽然简洁,但可能导致效率低下,特别是在没有优化的情况下。比如斐波那契数列的简单递归实现,其时间复杂度为O(2^n),这是由于大量重复计算造成的。

优化:使用Memoization

def fibonacci_memo(n, memo={}):

    if n in memo:

        return memo[n]

    if n <= 1:

        return n

    memo[n] = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo)

    return memo[n]

# 使用示例

print(fibonacci_memo(10))

# 输出: 55

通过缓存已计算的值,我们大大提高了函数的效率。

三、进阶应用

递归不仅限于简单算法,它在数据结构遍历、排序算法等领域也有广泛应用。

1、树的遍历

class TreeNode:

    def __init__(self, value=0, left=None, right=None):                 

        self.value = value

        self.left = left

        self.right = right

def inorder_traversal(root):

    if root:

       inorder_traversal(root.left)

       print(root.value)

       inorder_traversal(root.right)

# 使用示例

root = TreeNode(1, TreeNode(2), TreeNode(3))

inorder_traversal(root)

# 输出: 2 1 3

2、快速排序

def quicksort(arr):

    if len(arr) <= 1:

        return arr

    pivot = arr[len(arr) // 2]

    left = [x for x in arr if x < pivot]

    middle = [x for x in arr if x == pivot]

    right = [x for x in arr if x > pivot]

        return quicksort(left) + middle + quicksort(right)

# 使用示例

print(quicksort([3,6,8,10,1,2,1]))

# 输出: [1, 1, 2, 3, 6, 8, 10]

四、避免常见陷阱

递归的一个主要陷阱是无限递归,它会导致程序崩溃。确保每个递归调用都能够向基本情况靠近是避免无限递归的关键。

此外,深度递归可能导致堆栈溢出错误。在设计递归函数时,应当尽可能考虑性能优化和堆栈使用。

案例一:无限递归的风险

无限递归发生时,函数会不停地调用自身,而没有达到一个明确的停止条件,最终可能导致程序崩溃或者“栈溢出”错误。

问题示例:忘记添加基本情况

def infinite_recursion(n):

# 忘记了基本情况,导致函数无限调用自身

    print(n)

    infinite_recursion(n-1)

# infinite_recursion(5)

# 调用这个函数将导致无限递归

解决方案:确保每个递归函数都有一个明确的基本情况

def safe_recursion(n):

    if n <= 0: # 基本情况,确保递归能够停止

        print("Recursion ends.")

        return print(n)

    safe_recursion(n-1)   

safe_recursion(5)

案例二:递归深度和堆栈溢出

深度递归可能导致程序的调用栈过大,从而引发“栈溢出”错误。Python默认的最大递归深度较低(通常为1000),但可以手动调整。

问题示例:深度递归导致的堆栈溢出

def deep_recursion(n):

    if n == 0: # 基本情况

        return 0

    else:

        return deep_recursion(n-1) + 1

# deep_recursion(5000)

# 这个调用可能会导致堆栈溢出错误

解决方案:使用迭代或增加递归深度限制

迭代解决方案:

def iterative_solution(n):

     result =0

     for _ in range(n):

         result +=1

     return result

 print(iterative_solution(5000))

增加递归深度限制:

import sys

sys.setrecursionlimit(10000) # 增加Python的最大递归深度限制

def safe_deep_recursion(n):

    if n == 0:

        return 0

    else:

        return safe_deep_recursion(n-1)+1

print(safe_deep_recursion(5000))

通过这两个案例,读者可以看到在设计递归函数时必须谨慎,确保有适当的基本情况和考虑到递归深度,以避免无限递归和堆栈溢出问题。

递归是一个强大的工具,但也需要谨慎使用。理解其原理和潜在的陷阱,以及学会如何优化,对于编写高效且可靠的Python代码至关重要。通过本文介绍的概念和技巧,希望读者能够更加自信地使用递归解决问题。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2024-03-06 14:15
  • 阅读 ( 10 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

1038 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 1131 文章
  3. 小柒 1038 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章