Python---函数递归

编程思想:如何利用数学模型,来解决对应的需求问题;然后利用代码实现对应的数据模

算法:使用代码实现对应的数学模型,从而解决对应的业务问题

程序 = 算法 + 数据结构

在我们经常使用的算法中,有两种非常常用的算法:递推算法 + 递归算法,专门用于解决一些比较复杂,但是拆分后相似度又非常高的程序。

递推算法

递归算法:递推算法是一种简单的算法,即通过已知条件,利用特定条件得出中间推论,直至得到结果的算法。递推又分为顺推和逆推。

顺推:通过最简单的条件,然后逐步推演结果

逆推:通过结果找到规律,然后推导已知条件

递推算法案例:斐波那契数列

1 1 2 3 5 8 13 21 ...

① ② ③ ④ ⑤ ⑥ ...

第1位为1,第2位为1,第3位为2 = 1 + 1,第4位为3 = 2 + 1,依次类推...第n位结果为多少?

f(n) = f(n-1) + f(n-2)

提出问题:求斐波那契数列第15位的结果?

分析:f(15) = f(14) + f(13)

f(14) = f(13) + f(12)

f(13) = f(12) + f(11)

...

f(4) = f(3) + f(2) = 3 + 1

f(3) = f(2) + f(1) = 2

f(2) = 1

f(1) = 1

递推算法:使用while循环或for循环


# 递推算法:根据已知条件,求结果(或者根据结果求未知条件)
def recusive(n):""" 返回斐波那契数列某一位(n>=1)的结果 """if n == 1 or n == 2:return 1# 开始递推f(3) = f(2) + f(1)  f(4) = f(3) + f(2) ... f(15) = f(14) + f(13)dict1 = {1:1, 2:1}for i in range(3, n+1):# f(3) = f(2) + f(1)# f(i) = f(i-1) + f(i-2)dict1[i] = dict1[i-1] + dict1[i-2]return dict1[n]# 函数调用
print(recusive(15))

什么是递归算法

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

① 简化问题:找到最优子问题(不能再小) ② 函数自己调用自己


def func():# 自己调用自己func()func()

递归两种重要的元素

递归有两个非常重要的概念:

① 递归点:找到解决当前问题的等价函数(先解决规模比当前问题小一些的函数,依次类推,最终实现对问题的解决) => 有递有归

② 递归出口:当问题解决的时候,已经到达(必须存在)最优问题,不能再次调用函数了

注:如果一个递归函数没有递归出口就变成了死循环

编写递归三步走

① 明确你这个函数想要干什么

如:求斐波那契数列

② 寻找递归结束条件

如:就是在什么情况下,递归会停止循环,返回结果

③ 找出函数的等价关系式

如:斐波那契数列,第n位 f(n) = f(n-1) + f(n-2)

案例1:使用递归求斐波那契数列

第一步:明确这个函数想要干什么(先定义出来,明确调用方式)


# 斐波那契数列 1 1 2 3 5 8 13 21 ...
def f(n):# 编写递归代码求第n位的结果# 调用函数
print(f(15))  # 610

第二步:寻找递归的结束条件


# 斐波那契数列 1 1 2 3 5 8 13 21 ...
def f(n):# 编写递归代码求第n位的结果if n == 1 or n == 2:return 1# 调用函数
print(f(15))  # 610

第三步:找出函数的等价关系式(最关键的一步)


# 斐波那契数列 1 1 2 3 5 8 13 21 ...
def f(n):# 编写递归代码求第n位的结果if n == 1 or n == 2:return 1# 找出与斐波那契数列等价的关系式return f(n-1) + f(n-2)# 调用函数
print(f(15))  # 610

案例2:使用递归求N的阶乘(如n=100)

阶乘是什么?一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,如:n!=1×2×3×...×(n-1)×n

1! = 1

2! = 1x2 = 2

3! = 1x2x3 = 6

4! = 1x2x3x4 = 24

...

n!=1×2×3×...×(n-1)×n

第一步:明确这个函数要做什么以及定义函数以及调用方式


def f(n):# 编写递归条件print(f(100))

第二步:寻找递归的结束条件


def f(n):# 编写递归结束条件if n <= 2:return n# ...递归等式
print(f(100))

第三步:编写递归等价公式(自己要调用自己)

等价公式 = 找规律

1! = f(1) = 1

2! = f(2) = 2

3! = f(2)x3 = 6

4! = f(3)x4 = 24

...

n!= f(n-1) * n


def f(n):# 编写递归结束条件if n <= 2:return n# ...递归等式return f(n-1) * n
print(f(100))

案例3:面试题 => 猴子吃桃问题

猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半另加一个。到第10天早上想再吃时,就只剩下一个桃子了。求第1天共摘了多少个桃子

第一步:确定函数主要要完成什么功能,需要传递哪些参数,确认调用方式


def f(n):
    # 编写递归代码
    
# 调用f函数
print(f(1))


第二步:编写递归的结束条件(出口)


# 第一步:确定函数功能
def f(n):
    # 第二步:编写递归结束条件(出口)
    if n == 10:
        return 1

# 调用函数
print(f(1))


第三步:找出与这个问题相等的等式关系

求桃子的剩余数量?假设法:假设有10个桃子

第1天,10个桃子吃一半,10/2 = 5 + 1 = 6

第2天,4个桃子吃一半,4/2 = 2 + 1 = 3

第3天,再想吃剩1个

第n天,总剩余桃子的数量 = (第(n+1)天桃子的剩余桃子的数量 + 1) * 2


# 第一步:确定函数功能
def f(n):# 第二步:编写递归结束条件(出口)if n == 10:return 1# 第三步:寻找与这个问题相似的等价公式return (f(n+1) + 1) * 2# 调用函数
print(f(8))

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

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

相关文章

淘宝详情API接口:一键获取商品信息

一、引言 淘宝作为中国最大的电商平台&#xff0c;拥有庞大的商品信息库。为了更好地利用这些数据&#xff0c;开发者可以通过淘宝提供的API接口来获取商品详情。本文将深入探讨如何使用淘宝详情API接口一键获取商品信息&#xff0c;通过实践操作和代码示例&#xff0c;带领读…

多线程(补充知识)

STL库&#xff0c;智能指针和线程安全 STL中的容器是否是线程安全的? 不是. 原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL 默认…

【LeetCode】每日一题 2023_11_25 二叉树中的伪回文路径(dfs,数组/位运算)

文章目录 刷题前唠嗑题目&#xff1a;二叉树中的伪回文路径题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 这个月第一次周末早起~ 题目&#xff1a;二叉树中的伪回文路径 题目链接&#xff1a;1457. 二…

20世纪的葡萄酒有哪些创新?

葡萄酒是用酵母发酵的&#xff0c;直到20世纪中叶&#xff0c;这一过程都依赖于自然产生的酵母。这些发酵的结果往往不一致&#xff0c;而且由于发酵时间长&#xff0c;容易腐败。 酿酒业最重要的进步之一是在20世纪50、60年代引进了地中海的纯发酵菌种酿酒酵母&#xff0c;俗称…

你要的fiddler快捷键全部在这里了,学最全的快捷键,做最快的IT程序员

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF&#xff1a;查找 F12&#xff1a;启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键&#xff1a;ctrl q &#xff0c;然后 输入 help…

FunASR语音识别(解决-高并发线程问题)

文章目录 一、FunASR二、上代码&#xff08;队列解决线程并发问题&#xff09;三、测试 一、FunASR 在我的另一个博客有介绍FunASR,并且进行了语者分离&#xff0c;不过最近FunASR自带了语者分离&#xff0c;挺好挺好&#xff0c;但是一直看社区就是大家都用python写&#xff…

Codeforces Round #911 (Div. 2)

A.Cover in Water 题意&#xff1a; 有一个 1 n 1 \times n 1n的水池&#xff0c;里面有些格子可以加水&#xff0c;有些格子是被堵上的&#xff0c;你可以进行以下两种操作&#xff1a; 1.往一个空的格子里加水 2.移除一个有水的格子中的水&#xff0c;并将这些水添加到另…

合并区间[中等]

一、题目 以数组intervals表示若干个区间的集合&#xff0c;其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间。 示例 1&#xff1a; 输入&#xff1a;intervals […

【笔记】小白学习电路维修

学习视频&#xff08;b站&#xff09;&#xff1a;从0开始学电路 从0开始学电路维修 p1 黄色长方体元件P2 故障率最高的元件p3带芯铜丝线圈是什么区分电感和变压器接入电路分析&#xff1a; p4 交流和直流分界线整流桥接线整流桥故障判断 带色环的不一定是电阻 p1 黄色长方体元…

Windows10-用户账户控制、Windows远程桌面

Windows10用户账户控制怎么设置白名单 问题引出&#xff1a; 安装低版本搜狗输入法后经常弹出用户账户控制 解决方案&#xff1a; 全局模式&#xff1a; UAC控制最早出现在Windows Vista中&#xff0c;用户帐户控制&#xff08;UAC&#xff09;是一项旨在防止对您的计算机…

Django视图层

一、请求与响应 视图函数 视图函数&#xff0c;简称视图&#xff0c;属于Django的视图层&#xff0c;默认定义在views.py文件中&#xff0c;是用来处理web请求信息以及返回响应信息的函数&#xff0c;所以研究视图函数只需熟练掌握两个对象即可&#xff1a;请求对象(HttpRequ…

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目&#xff0c;网页显示如下&#xff0c;需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null&#xff0c;则执行下面的逻辑。在下面的…

贪心算法(新坑)

贪心入门 概述&#xff1a; 贪心算法是一种在每一步选择中都采取当前最优解的策略&#xff0c;希望最终能够得到全局最优解的算法。简单来说&#xff0c;它会不断地做出局部最优的选择&#xff0c;相信通过这种选择最终能够达到全局最优。 举个例子来说明。假设你要从一个迷…

CCFCSP试题编号:202206-2试题名称:寻宝!大冒险!

一、题目 二、分析 因为藏宝图左下角位置一定是一棵树&#xff0c;所以只要把所有绿化图中每一棵树&#xff0c;与之相匹配&#xff0c;然后判断&#xff0c;是否整个藏宝图都是绿化图的一部分&#xff0c;如果是那就计数count1。所以来看&#xff0c;结果count最大也就是n(绿…

js 函数的防抖(debounce)与节流(throttle)

目录 序言&#xff1a; 防抖&#xff08;debounce&#xff09; 节流&#xff08;throttle&#xff09; 代码示例 附录&#xff1a; 关于节流/防抖函数中 context&#xff08;this&#xff09; 的指向解析&#xff1a; 防抖函数中的 this 指向 节流函数中的 this 指向 序…

进程和线程的关系

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 进程&线程 1. 什么是进程PCB 2. 什么是…

高等数学零基础篇复习笔记

预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…

高中生分科考试--座位编排系统

这个系统是帮我一同学的哥哥的做的座位编排系统&#xff0c;他是某个学校的教育从事者 基本需求&#xff1a;就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排&#xff08;按成绩高低&#xff09;&#xff0c;同时输入相应的考场数&#xff0c;和每个考…

OpenJudge NOI 1.8 16:矩阵剪刀石头布 c语言

描述 Bart的妹妹Lisa在一个二维矩阵上创造了新的文明。矩阵上每个位置被三种生命形式之一占据&#xff1a;石头&#xff0c;剪刀&#xff0c;布。每天&#xff0c;上下左右相邻的不同生命形式将会发生战斗。在战斗中&#xff0c;石头永远胜剪刀&#xff0c;剪刀永远胜布&#…

解决git action发布报错:Input required and not supplied: upload_url

现象&#xff1a; 这个问题死活都找不到原因&#xff0c;后来打了一段调试的代码 - name: Debug Create Release Output run: | echo "Release ID: ${{ env.RELEASE_ID }}" echo "Release Upload URL: ${{ env.RELEASE_UPLOAD_URL }}" env: RELEASE_ID: ${…