当前位置: 首页 > news >正文

递归函数,数学表达式转化成递归函数

一、识别递归结构

  1. 什么是递归,其核心思想是什么
  • 递归是一个函数直接或间接地调用自身的操作方式。
  • 核心思想:递归通常用于把一个复杂的大问题分解成一个或几个相同结构的小问题,直到问题小到可以直接解决。
  1. 递归的过程
  • 不断拆解问题(递去):把问题越分越小。
  • 触底反弹(归来):遇到最小问题时开始返回结果。
    在这里插入图片描述
  1. 递归的必备条件(如果不满足的话,可能会导致无限循环或栈溢出)
  • 终止条件(Base Case)
    明确递归何时结束,防止无限调用。

  • 递归调用(Recursive Case)
    问题必须能分解为结构相同的子问题。

  • 向终止条件逼近
    每次递归调用必须是问题规模减小(从n次变成n-1次,知道最底层的基准条件)。

  1. 递归适用于什么场景
  • 问题本身可以分解成相同结构的子问题(数学归纳法得到的公式)
    例如:计算阶乘 (1×2×3×…×(n-1)×n)
    def factorial(n):if n == 0:  # 终止条件:0! = 1return 1return n * factorial(n - 1)  # 递归调用:n! = n × (n-1)!
    

这个函数的执行过程:

	factorial(3) = 3 × factorial(2)  = 3 × (2 × factorial(1))  = 3 × (2 × (1 × factorial(0)))  = 3 × (2 × (1 × 1))  = 6
  • 数据本身是递归定义的问题(链表、树)
    例如遍历二叉树

    class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef traverse(root):if root is None:  # 终止条件:空节点returntraverse(root.left)   # 递归左子树print(root.val)      # 访问当前节点traverse(root.right)  # 递归右子树
    

遍历二叉树的执行过程:

	      1/ \2   3/ \4   5遍历顺序:4 → 2 → 5 → 1 → 3
  • 需要回溯或组合尝试所有可能的问题(排序问题)

二、将数学表达式转化为递归函数

  1. 将数学表达式转化为递归函数需要理解递归的两个关键要素:基准条件递归关系。以下是系统化的转换方法:
  • 步骤1:原始的数学表达式
	1/(1×2) - 1/(2×3) + 1/(3×4) - 1/(4×5) + ... ± 1/(n×(n+1))
  • 步骤2:定义通项公式
    观察到第k项为:
	f(k) = (-1)^(k+1) × 1/(k×(k+1))
  • 步骤3:建立 n 和 n-1 项的递推关系
	S(n) = f(1) ± f(2) ± ... ± f(n)S(n) = S(n-1) ± f(n)S(n) = S(n-1) + (-1)^(n+1) × 1/(n×(n+1))
  • 步骤4:确定基准条件(最初的状态)
	S(0) = 0S(1) = 1/2
  • 步骤5:处理符号交替(有些简单的函数的处理可能没有这一步)
    通过奇偶判断实现符号交替:

    if n % 2 == 0:  # 偶数项为负return S(n-1) - term
    else:           # 奇数项为正return S(n-1) + term
    
  • 步骤6:将以上步骤转化为函数 形式

    def recursive_sum(n):# 基准条件if n == 0:return 0elif n == 1:return first_term_value# 计算当前项current_term = calculate_term(n)# 递归关系(根据符号规则调整+-)if is_positive_term(n):return recursive_sum(n-1) + current_termelse:return recursive_sum(n-1) - current_term
    
  1. 处理的关键点
  • 项数处理:递归参数n通常表示项数而非下标
  • 符号处理:通过(-1)^n或奇偶判断实现符号交替
  • 计算效率:注意Python默认递归深度限制(约1000层)
  1. 其他示例练习:斐波那契数列
  • 数学定义:
    1、确定基准:F(0)=0, F(1)=1
    2、确定第n项的公式:F(n)=F(n-1)+F(n-2)
    3、确定前n项和与前n-1项和的关系:S(n)=S(n-1)+F(n)
    4、注意观察是否需要符号转换,也就是数学公式里是否有(-1)^n
    
  • 尝试自己实现斐波那契数列的 第n项 和 前n项和 的递归实现:
    def fib(n):if n == 0:return 0elif n == 1:return 1else:return fib(n-1) + fib(n-2)def fib_sum(n):if n == 0:return 0elif n == 1:return 0+1else:return fib(n)+fib_sum(n-1)
    

通过这种系统化的分解方法,可以将大多数数学表达式转化为递归函数实现。


文章转载自:
http://anthropophagi.isnyv.cn
http://capacious.isnyv.cn
http://angiocarpous.isnyv.cn
http://canvasser.isnyv.cn
http://areaway.isnyv.cn
http://amyotrophia.isnyv.cn
http://blabbermouth.isnyv.cn
http://cementation.isnyv.cn
http://avp.isnyv.cn
http://bivouacking.isnyv.cn
http://apothecial.isnyv.cn
http://bennery.isnyv.cn
http://benefice.isnyv.cn
http://bearable.isnyv.cn
http://arenic.isnyv.cn
http://beardless.isnyv.cn
http://argonautic.isnyv.cn
http://bathetic.isnyv.cn
http://bookstall.isnyv.cn
http://batavia.isnyv.cn
http://ariboflavinosis.isnyv.cn
http://bandolero.isnyv.cn
http://bullwork.isnyv.cn
http://bern.isnyv.cn
http://assertor.isnyv.cn
http://cachinnate.isnyv.cn
http://amortization.isnyv.cn
http://alfilaria.isnyv.cn
http://anchorman.isnyv.cn
http://bradycardia.isnyv.cn
http://www.dtcms.com/a/215822.html

相关文章:

  • JavaSE核心知识点04工具04-03(Maven)
  • Electron 桌面程序读取dll动态库
  • 【React】-组件中实现高性能鼠标跟随提示框的完整优化过程
  • 模板应用更新同步到所有开发中的应用
  • 图片压缩工具 | Electron+Vue3+Rsbuild开发桌面应用
  • React useEffect和useEffectLa
  • 鸿蒙OSUniApp 实现带搜索功能的下拉菜单#三方框架 #Uniapp
  • element的el-table翻页选中功能
  • Kubernetes Admission Controller (准入控制器)详解:作用、原理、常见类型
  • DRF的使用
  • 计算机系统结构-第四章节-背诵
  • openpi π₀ 项目部署运行逻辑(四)——机器人主控程序 main.py — aloha_real
  • 使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第三部分)
  • MySQL问题:主要索引类型(聚簇、辅助、覆盖、前缀)
  • Debian 11 之使用hostapd与dnsmasq进行AP设置
  • C++ STL 容器:List 深度解析与实践指南
  • 手机收不到WiFi,手动输入WiFi名称进行连接不不行,可能是WiFi频道设置不对
  • 仿真环境中机器人抓取与操作上手指南
  • 从零实现本地语音识别(FunASR)
  • Vue3 封装el-table组件
  • 13. CSS定位与伪类/伪元素
  • 从 PyTorch 到 TensorFlow Lite:模型训练与推理
  • 从Node.js到Go:如何从NestJS丝滑切换并爱上Sponge框架
  • jenkins-jenkins简介
  • 微信小程序一次性订阅封装
  • Linux 环境下C、C++、Go语言编译环境搭建秘籍
  • React 第四十七节 Router 中useLinkClickHandler使用详解及开发注意事项案例
  • 【Redis】过期键删除策略,LRU和LFU在redis中的实现,缓存与数据库双写一致性问题,go案例
  • Web安全测试-文件上传绕过-DVWA
  • 人该怎样活着呢?54