递归函数(详解+实战)

news2024/10/5 17:24:22

目录

递归函数介绍

递归函数的作用

 案例:实现10以内阶乘

递归思想

递归的编写

 斐波那契数列(实战)

循环实现

递归实现


递归函数介绍

递归函数是指在函数的定义中调用函数本身的过程。递归函数可以用于解决那些可以通过将大问题拆分为更小的相似子问题来解决的情况。它通常包含两个关键部分:基本情况(递归终止条件)和递归调用。

基本情况(递归终止条件)是一个条件判断,当满足该条件时,递归函数不再调用自身,而是返回一个特定的值或执行特定的操作。这个基本情况用于避免递归无限进行,导致栈溢出错误。

递归调用是指在函数的定义中使用相同的函数来解决规模更小的子问题。通过不断地调用自身,并且每次调用时传递一个规模更小的子问题,递归函数最终会达到基本情况,从而逐步解决原始问题。

递归函数的设计需要满足以下要求:

  1. 定义明确的基本情况,确保递归函数可以终止。

  2. 在每次递归调用中,问题的规模都应该比原始问题减小,以便最终达到基本情况。

  3. 确保递归函数的每次调用都在不同的数据上进行操作,避免重复计算。

递归函数在解决许多问题时非常有用,如计算阶乘、斐波那契数列、二叉树遍历、图搜索等。它们可以提供一种简洁和直观的解决方案,并且在某些情况下比迭代方式更加简单和有效。

注意

使用递归容易产生栈溢出的错误

  • 递归一定要有出口,否则就是"死循环"的递归
  • 递归的次数不能太多

递归函数的作用

  1. 解决复杂问题:递归函数能够将一个复杂的问题分解为更小、更简单的子问题,从而使问题的解决变得更加直观和简单。

  2. 提高代码可读性:递归函数能够以一种自然而直观的方式描述问题的解决过程,使代码更易于理解和维护。

  3. 优化算法实现:某些问题的最优解往往可以通过递归函数来实现,例如分治算法、回溯算法等。递归函数可以帮助我们以更简洁的方式实现这些算法,提高代码的效率和可扩展性。

  4. 处理树形结构和递归数据结构:递归函数常用于处理树形结构、图等递归数据结构。例如,在树的遍历、搜索和构建等问题中,递归函数能够很好地表达和处理这些结构。

  5. 函数式编程:递归是函数式编程的重要概念之一,函数式编程强调使用函数来进行问题求解。递归函数是函数式编程中常用的工具,能够实现函数的组合和高阶函数的应用。

 案例:实现10以内阶乘

def jie_cheng1(num:int) ->int:
  count = 1
  for i in range(1,num+1):
    count *=i
  return count
print(jie_cheng1(10))

递归思想

递归其主要思想在于:

  • 将问题分为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决
  • 分解完后,再合并结果

image-20220905124235541

递归的编写

  • 定义 一个函数
  • 找到出口条件
  • 找到规律

 

 

def jie_cheng2(num:int):
  if num == 1:
    return 1
  else:
    return num * jie_cheng2(num-1)
print(jie_cheng2(10))

image-20220905130236295

 

 斐波那契数列(实战)

问题

有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一只兔子,假如兔子都不死,问第二十个月的兔子对数为多少

斐波那契数列,又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...

这个数列从第3项开始,每一项都等于前两项之和

循环实现

def fib1(n:int) -> int:
  if n <= 0:
    return 0
  elif n == 1 or n == 2:
    return 1
  a = b = 1
  rs = 2
  # 1 1 2 3
  for i in range(3,n):
    a = b
    b = rs
    rs = a + b
  return rs

递归实现

def fib2(n:int) -> int:
  if n <= 0:
    return 0
  elif n == 1 or n == 2:
    return 1
  else:
    return fib2(n-1) + fib2(n-2)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

窗口看门狗 WWDG

窗口看门狗介绍 Q: 什么是窗口看门狗&#xff1f; A: 窗口看门狗用于监测单片机程序运行时效是否精准&#xff0c;主要检测软件异常(独立看门狗检测的是硬件异常)&#xff0c;一般用于需要精准检测&#xff08;独立看门狗不太精准&#xff09;程序运行时间的场合。 窗口看门狗…

MySQL数据库操作篇3(聚合函数分组查询)

通过MySQL提供的聚合函数&#xff0c;可以很方便的进行一些计算来辅助查询&#xff0c;所谓聚合函数就是将表中的数据统计后进行的某种处理 分组查询可以理解成将一张表按照某个属性分成多张表&#xff0c;属性值相同的在一张表里 比如说学生表&#xff0c;按照性别这个属性分组…

java+大数据实战 短链项目

一.前言 1.1课程大致包含技术 首先选这套课的目的是 包含了我所学的大部分技术 比如springboot ssm redis kafka flink clickhouse 等 1.2 外界客观原因 就业环境一般 目前来看暂时还没但是有后续潜在的毕业 或者 离职 1.3技术追求 个人的技术追求暂时是在技术总监 技术…

vue3功能实现

在vue2中&#xff0c;要实现一些方法&#xff08;增删改查&#xff09;一般都是写在一起的。如下图所示&#xff1a; 但是在vue3中&#xff0c;实现一个方法需要用到很多文件。 方法定义方法如下&#xff1a; export function classSign(phone: string) {return sign_reques…

TypeScript基础篇 - 类型的思考方式

目录 重新认识&#xff1a;什么是类型&#xff1f; 类型是人类的思考方式 类型是错误检查的利器 总结&#xff1a;为什么我们用TS&#xff1f; 一张ai生成图~ 重新认识&#xff1a;什么是类型&#xff1f; 汽车可以跑怎么理解&#xff1f; car.run() 【面向对象】car imp…

【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

微服务架构Ribbon与OpenFeign的使用 【快速入门】

一、实现负载均衡&#x1f349; 1.什么是负载均衡&#x1f95d; 通俗的讲&#xff0c; 负载均衡就是将负载&#xff08;工作任务&#xff0c;访问请求&#xff09;进行分摊到多个操作单元&#xff08;服务器,组件&#xff09;上进行执行。 根据负载均衡发生位置的不同,一般分…

Terraform(一)

IaC 自动化配置与编排神器 - Terraform 1. 相关概念1.1 什么是 IaCIaC 的两种实现方式IaC 的好处IaC 优点IaC 工具为什么 IaC 对 DevOps 很重要&#xff1f; 1.2 什么是 Terraform1.3 Terraform 的主要特性1.4 Terraform 架构1.5 Terraform 核心概念1.6 Terraform 生命周期1.7 …

高等数学❤️第一章~第二节~极限❤️无穷小量与无穷大量~无穷小量概念及其性质与比较详解

【精讲】高等数学中的无穷小量概念及其性质与比较 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 【精讲】高等数学中的无穷小量概念及其性质与比较 导言 一、无穷小量的概念 二、无穷小量的性质 三、无穷小量的比较 四、无穷小量的应用 必需记忆知识点…

【C++刷题集】-- day4

目录 选择题​​​​​​​ 单选 编程题 计算糖果⭐ 【题目解析】 【解题思路】 进制转换⭐​​​​​​​ 【题目解析】 【解题思路】 选择题 单选 1、 有以下程序 #include<iostream> #include<cstdio> using namespace std; int main() {int m 0123, n 123…

(文章复现)售电市场环境下电力用户选择售电公司行为研究(附matlab代码)

参考文献&#xff1a; [1]孙云涛,宋依群,姚良忠等.售电市场环境下电力用户选择售电公司行为研究[J].电网技术,2018,42(04):1124-1131. 1.基本原理 1 .1演化博弈 与古典博弈理论相比较&#xff0c;演化博弈假设参与人是有限理性的&#xff0c;参与人会根据自己和他人的经验选…

【前端】网页开发精讲与实战 CSS Day 4

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;前端 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有…

Vue+Ts+Echart使用以及后台接口对接逻辑【实战】

官网传送门 一.echarts介绍 是一个js插件 性能好可流畅远行PC和移动设备 兼容主流浏览器 提供很多图标,用户且可自行修改。 2.使用npm安装 npm install echarts二.echarts基本使用、自定义图例、选择7天日期查询图表数据内容 获取本地时间以及当前时间前几天后几天 /*** 获…

安装Visual Studio Installer Projects 2022插件

VS主界面--扩展--管理扩展--搜索VS插件“Visual Studio Installer Projects 2022”并安装。

JavaWeb(5)——HTML、CSS、JS 快速入门

一、JavaScript 对象 二、JavaScript BOM对象 和 DOM对象 关于BOM主要对 Window 和 location 进行说明&#xff1a; 三、JavaScript 事件监听 事件绑定 常见事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

ORA-01122 ORA-01208 故障处理---惜分飞

数据库突然故障ORA-01122 ORA-01208,导致实例crash Tue Jul 11 09:06:43 2023 Thread 1 cannot allocate new log, sequence 254989 Private strand flush not complete Current log# 3 seq# 254988 mem# 0: E:\APP\ADMINISTRATOR\ORADATA\xff\REDO03.LOG Thread 1 advanced …

23款奔驰E300加装原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶&#xff0c;可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出&#xff0c;并且在关闭后能够立刻散去。车内气味不会永久改变&#xff0c;香氛…

javascript(js)组成及使用

组成&#xff1a; js是由核心ECMAScript、文档对象模型DOM、浏览器对象模型BOM三部分组成。 ECMAScript&#xff1a;定义了语言的语法、类型、语句、关键字、保留字、操作符、对象。有普通模式和严格模式的区分。文档对象模型(DOM)&#xff1a;由XML经过扩展用于HTML的应用程序…

代码随想录算法学习心得 45 | 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组...

一、最长递增子序列 链接&#xff1a;力扣 描述&#xff1a;给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c…