编程语言在构建程序时的基本操作有:内置数据类型操作、选择、循环、函数调用等,递归实际属于函数调用的一种特殊情况(函数调用自身),其数学基础是数学归纳法。递归在计算机程序设计中非常重要,是许多高级算法实现的基础

编写递归程序的几个要点:

1、终止条件:最简单情况(避免无限循环)

2、递归公式:相邻两次调用间的关系(递归算法核心)

3、忽略调用具体细节:假设所有调用都会达到终止条件(从思想上接受递归算法的关键)

4、效率:递归算法有时效率较低,可考虑其他更高效的实现方式(见问题5)

下面我们通过几个典型问题了解递归程序的的写法和思路:

问题1:求F(n)=1+2+3+...+n

也可用for循环实现,相比之下递归的代码更加简洁

从后往前:

def F(a):
if len(a)==1:return(a[0])
return(F(a[1:])+a[0])

或从前往后:

def FF(a):
n = len(a)
if n == 1:return(a[0])
return (FF(a[:n-1])+a[n-1])

效果:

a=[1,4,6,9]
print(F(a))
>> 20

问题2:n条直线最多可以划分的平面个数?

首先举几个简单的例子,F(1) = 2,F(2) = 4,F(3) = 7

简单画个图就可以看出,每次划分增加1条直线,实际是在上次划分的基础上增加了n个交点,进而增加了n个平面

def F(n):
if n == 1:return(2)
return(F(n-1) + n)

问题3:求两个正整数的最大公约数

利用欧几里得算法:若p>q,则p和q的最大公约数等于q和p%q的最大公约数(证明思路:p和q的最大公约数等于p和p-q的最大公约数,也等于p和p-2q的公约数,以此类推直到p和p-nq即p%q)

终止条件:p被q整除,q=0,p即为所求(任何正整数都可被1整除,故一定能收敛)

def F(p,q):
if q == 0:return p
print(p,q)
return F(q,p % q)
print(F(1440,408))
>> 1440 408
>> 408 216
>> 216 192
>> 192 24
>> 24

问题4:汉诺塔问题。把圆盘按大小顺序移到另一个圆盘上,每次只能移一个,小圆盘不能放大圆盘上边,如果有64个圆盘,需要挪多少次?

像这种问题如果生想的话估计会把脑细胞耗尽,索性我们有递归大法,可以忽略具体的实现细节:

终止条件:f(1)=1

递归公式:f(n)=2f(n-1)+1

def F(n):
if n == 1:return 1
return 2*F(n-1)+1 >>print(F(64))
>>18446744073709551615

问题5:斐波那契数列(1,1,2,3,5,8,13,21,34...)求和

def F(n):
if n == 1 or n == 2:
return 1
return(F(n-1) + F(n-2))

但由于存在重复计算,此程序效率较低,实际开发中通常采用其他方式实现,详见:

斐波那契数列的5种Python写法

斐波那契数列的矩阵解法

问题6:编写merge(L1,L2)函数,将两个排好序的小列表合成一个排好序的大列表,如merge([1,2,4],[3,5])=[1,2,3,4,5]

merge()是归并排序算法中的关键函数,我们在这里用递归实现一下:

def merge(L1,L2):
if len(L1) == 0:return(L2)
if len(L2) == 0:return(L1)
if L1[0]<L2[0]:
return([L1[0]]+merge(L1[1:len(L1)],L2))
else:
return([L2[0]]+merge(L1,L2[1:len(L2)])) >>print(merge([1,2,4],[3,5]))
>>[1,2,3,4,5]

当然merge()有许多其他的实现方法,大家可自行探索

掌握了递归思想后,我们就可以写出更加简洁、高效的程序了。在后续算法的学习中,要注意递归思想在不同条件下的体现,熟练运用

Python算法——递归思想的更多相关文章

  1. Java算法——递归思想

    描述递归(recursion):程序调用自身的编程技巧. 递归满足2个条件:1)有反复执行的过程(调用自身)2)有跳出反复执行过程的条件(递归出口) 递归与栈的关系下面演示的是求n的阶乘 int Fa ...

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

    Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...

  3. Python <算法思想集结>之初窥基础算法

    1. 前言 数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机. 什么是数据结构? 指数据在计算机中的存储方式,数据的存储方式会影响到获取数据的便利性. 现实生活中 ...

  4. 《编程简介(Java) &#183;10.3递归思想》

    <编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...

  5. python算法(一)

    python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...

  6. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

  8. python算法题 python123网站单元四题目

    目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来)   下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...

  9. python算法介绍:希尔排序

    python作为一种新的语言,在很多功能自然要比Java要好一些,也容易让人接受,而且不管您是成年人还是少儿都可以学习这个语言,今天就为大家来分享一个python算法教程之希尔排序,现在我们就来看看吧 ...

随机推荐

  1. Win10系列:C#应用控件基础4

    ComboBox控件 ComboBox控件包含一个不可编辑的文本框和一个下拉列表,这个下拉列表是由多个ComboBoxItem子元素组成的.使用ComboBox控件可以节省界面空间,因为ComboBo ...

  2. linux 用户/群组/权限

    mv 原文件名 新文件名 #相当于重命名 查看文件内容相关命令 cat #查看文件全部内容 head - n #查看文件前n行内容(默认前十行) tail -n #查看文件后n行内容(默认后十行) t ...

  3. redis、memcache、mongoDB 对比

    从以下几个维度,对 redis.memcache.mongoDB 做了对比. 1.性能 都比较高,性能对我们来说应该都不是瓶颈. 总体来讲,TPS 方面 redis 和 memcache 差不多,要大 ...

  4. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  5. CSS特性

    css的特性 css具有两大特性:继承性和层叠性 1.继承性 指的是子元素继承父元素的样式,但没有所有的样式都可以继承(那样就太可怕了) 所以具有继承性的属性主要分为三大类 a.文本属性 font-s ...

  6. block,inline-block,行内元素区别及浮动

    1.block: 默认占据一行空间,盒子外的元素被迫另起一行 2.inline-block: 行内块盒子,可以设置宽高 3.行内元素: 宽度即使内容宽度,不能设置宽高,如果要设置宽高,需要转换成行内块 ...

  7. 什么是Java优先级队列(Priority Queue)?

    PriorityQueue是一个基于优先级堆的无界队列.它的元素是按照自然顺序排序的.在创建元素的时候,我们给它一个一个负责排序的比较器.PriorityQueue不允许null值,因为 它们没有自然 ...

  8. 【转】strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号"int g_cTemplates"

    加入了DirectShow的基类链接库后,如果此时编译就会出现以下编译错误: strmbasd.lib(wxutil.obj) : error LNK2019: 无法解析的外部符号 __imp__ti ...

  9. centos服务器删除/usr目录怎么办

    凉拌 两种方法: 第一:重装系统,因为你的大部分命令使用不了了,如果你的服务器还有应用程序在跑,那你的服务也会有问题,因为一些服务的lib包也会放在此目录下,貌似需要重新装才可以 第二:利用ios镜像 ...

  10. mysql常见查询练习题

    #建学生信息表student create table student ( sno varchar(20) not null primary key, sname varchar(20) not nu ...