python - 算法基础 - 递归

递归在需要重复操作且操作范围呈规律性变化时可以很方便帮我们解决问题

递归的特点:
  1、递归就是在函数中调用自身
  2、在使用递归时,必须有一个明确的结束条件,成为递归出口
  3、递归算法通常显的很简洁,但是效率较低,所以一般不提倡用递归算法设计程序
  4、在递归调用的过程中,系统为每一层的返回点、局部变量等开辟了栈来存储,递归次数过多容易造成栈溢出等

使用递归的要求:
  1、每次相对前一次复杂度(一般是操作范围)都有所减小(通常是减半)
  2、相邻两次重复之间有密切关系,前一次要为后一次做准备(通常是前一次的输出作为后一次的输入)
  3、在问题复杂度极小时,要给出确切的解答(递归结束条件),进而不再进行递归调用

看下面例子:

1 def calc(n):
2     print(n)
3     if n/2 >1:
4         res = calc(n/2)
5         print("看我何时打印以及打印次数:",res)
6     print("看n的值的变化:",n)
7     return n
8 
9 calc(20)
20
10.0
5.0
2.5
1.25
看n的值的变化: 1.25
看我何时打印以及打印次数: 1.25
看n的值的变化: 2.5
看我何时打印以及打印次数: 2.5
看n的值的变化: 5.0
看我何时打印以及打印次数:  5.0
看n的值的变化: 10.0
看我何时打印以及打印次数: 10.0
看n的值的变化: 20

根据上面的结果可以看出递归执行时的顺序

用递归算法实现斐波那契数列:

  菲波那切数列原理:数列中(n>=3)后一个数等于前两个数的和

 1 >>>
 2 >>> def get_fbnq(arg1,arg2,stop):
 3     ‘‘‘打印菲波那切数列片段,上限为stop‘‘‘
 4     if arg1 == 0:
 5         print(arg1,arg2)
 6     arg3 = arg1 + arg2
 7     if arg3 < stop:
 8         print(arg3)
 9         get_fbnq(arg2,arg3,stop)
10
11
12 >>> get_fbnq(0,1,600)
13 0 1
14 1
15 2
16 3
17 5
18 8
19 13
20 21
21 34
22 55
23 89
24 144
25 233
26 377
27 >>> 
时间: 2024-11-03 22:03:17

python - 算法基础 - 递归的相关文章

python算法之递归思想

#递归思想#基本原理:函数内部调用函数本身,注意:至少有一个终止条件#例1.斐波那契数列def fib(x): if x==1 or x==2: return 1 else: return fib(x-1) + fib(x-2)def fibList(x): fibList = [] for i in range(x): fibList.append(fib(i+1)) return fibListprint(fibList(9)) #例2.n的阶乘(n*(n-1)*(n-2)*...2*1)d

python算法基础

1.二维数组90度旋转 data = [[col for col in range(4)] for row in range(4)] for v in data:     print(v) for r_index,row in enumerate(data):     for c_index in range(r_index,len(row)):         tmp = data[c_index][r_index]         data[c_index][r_index] = row[c

python小白-day4递归和算法基础

递归&算法基础 一.递归 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出. 1 2 3 4 5 6 7 8 def calc(n):     print(n)     if n/2>1:         r

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

Python算法:推导、递归和规约

Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心知识:Induction(推导).Recursion(递归)和Reduction(规约),这是原书的重点和难点部分 正如标题所示,本节主要介绍下面三部分内容: • Reduction means transforming one problem to another. We normally red

Python 从基础------进阶------算法 系列

简介 关于Python的知识,其实自己很早就想单独开一个系列出来,但是碍于自己太懒了,到现在都还没执行.最近觉得自己实在是没有脸面在拖延下去了,遂将自己学习的整理一下,便于以后自己翻看.此前花过一段时间学习了有些Python的基础,做了一些简单的笔记,记录在印象笔记里.后期买了几本关于Python的书籍,但是到现在也只是看了基础的四分之一,希望借此来督促自己,争取早日完成自己学习Python的目标.由于个人挑选的书的原因,此系列主要包含,基础.进阶.算法等,若在此过程中有什么地方描述的不对的地方

算法基础——经典八大排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆.下图是这八大排序算法的分类.名称.时间空间复杂度,以及稳定性. 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍<算法导论>里的伪代码实现的,我在关键语句部分附上了注释. 按照上图中的顺序分别介绍八大排序算法的实现(升序),前面是Java,后面是Python.Java的排序函数写在了一个类里,Python的排序函数则直接写出来了. 直接插入排序 public class InsertS

基础算法之三——递归法

基础算法之三--递归法"汉诺塔问题" 题目描述 古代有一座汉诺塔,塔内有三个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且在移动过程中,3个座上的盘子始终要保持大盘在下,小盘在上.在移动过程中可以利用B座来放盘子.要求输出移动的步骤. 输入数据 汉诺塔内的盘子个数n.(1<n<64) 输出要求 输出移动的步骤,每行一步,如从A座移动到C座,输出"A->C&quo

算法基础_递归_求杨辉三角第m行第n个数字

问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好): import java.util.Scanner; /** * 求杨辉三角第m层第n个数字 * @author Administrator * */ public class Demo05 { public static int f(int m,int n) { if(n==0)return 1