当前位置: 首页 > 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://www.xdnf.cn/news/679573.html

相关文章:

  • Spring Boot 深度集成 Ollama 指南:从聊天模型配置到生产级应用开发
  • 【STM32】HAL库 之 CAN 开发指南
  • 常用的数据分布
  • [小白]Docker部署kingbase(人大金仓)数据库[超详细]
  • win11如何重启
  • 算法打卡第八天
  • 工业控制系统的神经网络:TSN交换机是如何改变自动化通信的?
  • Python训练营打卡Day38
  • 【DSP笔记】解锁频率之秘:Z 变换与离散傅里叶变换的深度探索
  • 一些视觉应用中的数学小知识点总结
  • Mate桌面环境系统与终端模拟器参数配置
  • ai客服平台哪家好:AnKo多模型AI聚合时代!
  • Python实现自动物体识别---基于深度学习的AI应用实战
  • 【Git】Commit Hash vs Change-Id
  • 浏览器缓存详细介绍
  • API平台(API网关)的API监控预警机制
  • 欧几里得 ---> 裴蜀定理 ---> 拓展欧几里得
  • 使用MATLAB求解微分方程:从基础到实践
  • ProfiNet转MODBUSTCP网关模块的实时性保障Logix5000控制器与AltivarProcess变频器同步控制方案
  • 【leetcode】977. 有序数组的平方
  • Microbiome|基于MAG的宏转录组
  • TailwindCSS v4 快速入门教程
  • 在Linuxfb环境下利用海思TDE API实现高效的2D图形加速
  • Java中的日期类详解
  • 数据泄露频发,Facebook的隐私保护是否到位?
  • 12. CSS 布局与样式技巧
  • [网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发
  • 使用tunasync部署企业内部开源软件镜像站-Centos Stream 9
  • 用ChatGPT辅助UI设计:从需求分析到风格提案的提效秘籍
  • 代码随想录算法训练营第五十一天