递归算法实例

先copy一下百度百科的解说。程序调用自身的编程技巧称为递归( recursion)。

例如,要计算1-9的9位数字的乘积,直观的算法是1*2*3*4*5*6*7*8*9,如果

要计算1-10000的乘积,直观的算法就难于实现出,而递归就可以很简单的实现。

实例1

# coding: utf-8

def recurision(n):                       # recurision 就是递归

if n == 1:

return n                               # 在函数里面输出运算值的地方,如果用print, 用print type(recurision(10)), 显示

else:                                         其是NoneType,而显然,只有数才能和数相乘。所以我们用return返回函数的值。

return n * recurision(n - 1)

recurision(10)

好吧, 是不是没看懂啊。一开始我也摸不着头脑。 不过既然是数学问题,列个式子

你就知道了。

recurision(n) = n * resurision(n - 1)

= n * (n - 1) * recurison(n - 2)

直到 n = 1, 也就是if成立的时候, 所以我们用if...else语句

so easy!

----------------------------------------------------------------------------------

实例2

我们要删除脚本文件(‘.py‘程序)所在的文件夹下面的所有文本文件(以‘.txt‘ 为后缀名)

# coding: utf-8

import os

import sys

# 脚本文件所在的目录/路径,比如‘c:\python27\1.py‘ 前面 的‘c:\python27‘

currdir = sys.path[0]

def  RemoveFile(dir, postfix):

# 判断是否为文件夹,是为True, 否为False。 同理 os.path.isfile 判断是否为文件

if os.path.isdir(dir):

for file in os.listdir(dir):                       # os.listdir列出dir目录下所有的子文件和子文件夹。

RemoveFile(dir + ‘\\‘ + file, postfix)

elif os.path.splitext(dir)[1] == postfix:   # os.path.splitext()将文件名的前缀与后缀分开。比如1.txt的1和.txt

os.remove(dir)                                   # os.remove()删除该文件

RemoveFile(currdir, ‘.txt‘)

Ok, 让我们来消化一下。假设我们的这个脚本名是1.py, 放在‘c:\python27‘下, 而这文件夹里面还有1.txt和2.txt之类

要删除的文件。

执行RemoveFile(currdir, ‘.txt‘)之后肯定是if语句先成立,因为currdir首先就是py文件所在的目录了(目录除了路径的意

思,就是指文件夹) 。而像RemoveFile(‘c:\\python27‘ + ‘\\‘ + 1.py, ‘.txt‘)一看就后缀名不一样。踢掉。 所以, 最后, 只有txt文件是符合elif的情况的。顺利删除。

时间: 2024-12-29 11:26:43

递归算法实例的相关文章

转: JAVA递归算法实例小结

一.递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件.这一点是非常重要的.其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了. 关键要抓住的是:(1)递归出口 (2)地推逐步向出口逼近 二.递归算法实例 (1)阶乘: 要求:给定一个数值,计算出它的阶乘值,

递归算法总结

在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法.递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解.递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身.(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口.(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低.所以一般不提倡用递归算法设计程序.(4) 在递归调用的过程当中系统为每一层的返回点.局部量等开

基本算法思想Java实现的详细代码

基本算法思想Java实现的详细代码 算法是一个程序的灵魂,一个好的算法往往可以化繁为简,高效的求解问题.在程序设计中算法是独立于语言的,无论使用哪一种语言都可以使用这些算法,本文笔者将以Java语言为例介绍一些常用的算法思想. 分类 穷举算法思想 递推算法思想 递归算法思想 分治算法思想 概率算法思想  穷举算法思想 穷举算法的基本思想 从所有可能情况中搜索正确答案 1. 对于一种可能情况,计算其结果. 2. 判断结果是否满足,如不能满足者执行第一步来搜索下一个可能的情况:如满足则表示选找到一个

python日记_递归

递归算法 1.递归的定义 递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法. 递归常与分治思想同时使用,能产生许多高校的算法.递归常用来解决结构相似的问题.所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决.具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法:第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果..实际上,递归是把一个不能或不好解决的大问题转化成一个或几个小问

递归案例

一般定义 程序调用自身的编程技巧称为递归( recursion). 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. 注意: (1) 递归就是在过程或函数里调用自

求两个正整数的最大公约数的函数

求最大公约数的欧几里得算法是一个递归算法,据说出现在公元前375年,或许是最早的递归算法实例: gcd(x, y) =  x ;                            (y = 0) = gcd(y, x mod y);         (y > 0) 注:mod是求模,相当于程序中的%. int gcd(int x, int y)                    //最终返回x,y的最大公约数 { return y?gcd(y, x/y):x;        //递归,用

2018.3.31 java中的递归

java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n) =1 f(n)=f(n)*f(n-1) 4.普通实现与递归实现的比较 普通实现 //计算5的阶乘 public class Demo { public static void main(String[] args) { int sum = 1; for (int i =5; i >=1; i--

递归算法经典实例小结(C#实现)

 一 .递归算法简介 在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法. 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解.递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身. (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低.所以一般不提倡用递归算法设计程序. (4) 在递归调用的过程当中

递归算法及其实例

递归算法的核心有两点: 1.递归的终止条件 递归函数的有无返回值和返回值类型决定了函数中递归终止条件的设定2.分解后的子问题 实例1——汉诺塔问题 1 #include<iostream> 2 using namespace std; 3 void Hanoi(int n,char A,char B,char C){ 4 if(n==1) cout<<"MOVE top disk from "<<A<<" to "&l