JAVA递归算法实例小结

JAVA递归算法实例小结
JAVA递归算法实例小结

package com.zf.s2;// 创建一个包

import java.math.BigInteger;// 导入类

import java.util.ArrayList;

import java.util.List;

public class TextFactorial {// 操作计算阶乘的类

public static int simpleCircle(int num){// 简单的循环计算的阶乘int sum=1;

if(num<0){// 判断传入数是否为负数

throw new IllegalArgumentException(" 必须为正整数}

for(int i=1;i<=num;i++){// 循环num

sum *= i;// 每循环一次进行乘法运算

}

return sum;// 返回阶乘的值

}

public static int recursion(int num){// 利用递归计算阶乘int sum=1;

if(num < 0)

throw new IllegalArgumentException(" 必须为正整数if(num==1){

return 1;// 根据条件,跳出循环

}else{

sum=num * recursion(num-1);// 运用递归计算

return sum;

}

}

public static long addArray(int num){// 数组添加计算阶乘long[]arr=new long[21];// 创建数组arr[0]=1;

int last=0;

if(num>=arr.length){

throw new IllegalArgumentException(" 传入的值太大} if(num < 0)

throw new IllegalArgumentException(" 必须为正整数while(last

arr[last+1]=arr[last]*(last+1);// 进行运算last++;//last 先进行运算,再将last 的值加 1

}

return arr[num];!");// 抛出不合理参数异常!");// 抛出不合理参数异常");// 抛出传入的数太大异

!");// 抛出不合理参数异常

}

public static synchronized BigInteger bigNumber(int num){// 利用BigInteger 类计算阶乘

ArrayList list = new ArrayList();// 创建集合数组list.add(BigInteger.valueOf(1));// 往

数组里添加一个数值for (int i = list.size(); i <= num; i++) {

BigInteger lastfact = (BigInteger) list.get(i - 1);// 获得第一个元素

BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(i));// 获得下一个数

list.add(nextfact);

}

return (BigInteger) list.get(num);// 返回数组中的下标为num 的值}

public static void main(String []args){//java 程序的主入口处

int num=5;

int num1=23;

System.out.println(" 简单的循环计算"+num+" 的阶乘为"// 调用simpleCircle

+simpleCircle(num));

System.out.println(" 利用递归计算"+num+" 的阶乘为"// 调用recursion

+recursion(num));

System.out.println(" 数组添加计算"+num+" 的阶乘为"// 调用addArray

+addArray(num));

System.out.println(" 利用BigInteger 类计算"+num1+" 的阶乘为"// 调用bigNumber +bigNumber(num1));

}

算法设计与分析习题答案1-6章

习题1 1. 图论诞生于七桥问题。出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现 在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次, 图是这条河以及河上的两个岛和七座桥的草 图。请将该问题的数据模型抽象出来,并判断此问题是否有解。 七桥问题属于一笔画问题。 输入:一个起点 输出:相同的点 1, 一次步行 2, 经过七座桥,且每次只经历过一次 3, 回到起点 该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个奇点的图形。 2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。请用伪代码描述这个版本的欧几里德算法 =m-n 2.循环直到r=0 m=n n=r r=m-n 3 输出m 3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。要求分别给出伪代码和C++描述。 编写程序,求n 至少为多大时,n 个“1”组成的整数能被2013整除。 #include using namespace std; int main() { double value=0; 图 七桥问题

for(int n=1;n<=10000 ;++n) { value=value*10+1; if(value%2013==0) { cout<<"n至少为:"< using namespace std; int main () { double a,b; double arctan(double x);圣经上说:神6天创造天地万有,第7日安歇。为什么是6天呢?任何一个自然数的因数中都有1和它本身,所有小于它本身的因数称为这个数的真因数,如果一个自然数的真因数之和等于它本身,这个自然数称为完美数。例如,6=1+2+3,因此6是完美数。神6天创造世界,暗示着该创造是完美的。设计算法,判断给定的自然数是否是完美数 #include using namespace std; int main() { int value, k=1; cin>>value; for (int i = 2;i!=value;++i) { while (value % i == 0 ) { k+=i;有4个人打算过桥,这个桥每次最多只能有两个人同时通过。他们都在桥的某一端,并且是在晚上,过桥需要一只手电筒,而他们只有一只手电筒。这就意味着两个人过桥后必须有一个人将手电筒带回来。每个人走路的速度是不同的:甲过桥要用1分钟,乙过桥要用2分钟,丙过桥要用5分钟,丁过桥要用10分钟,显然,两个人走路的速度等于其中较慢那个人的速度,问题是他们全部过桥最少要用多长时间? 由于甲过桥时间最短,那么每次传递手电的工作应有甲完成 甲每次分别带着乙丙丁过桥 例如: 第一趟:甲,乙过桥且甲回来

递归算法详解

递 归 冯文科 一、递归的基本概念。 一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引 用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。在程序设计中,函数直接或间接调用自己,就被称为递归调用。 二、递归的最简单应用:通过各项关系及初值求数列的某一项。 在数学中,有这样一种数列,很难求出它的通项公式,但数列中各项间关系却很简单,于是人们想出另一种办法来描述这种数列:通过初值及n a 与前面临近几项之间的关系。 要使用这样的描述方式,至少要提供两个信息:一是最前面几项的数值,一是数列间各项的关系。 比如阶乘数列 1、2、6、24、120、720…… 如果用上面的方式来描述它,应该是: ???>==-1 ,1,11n na n a n n 如果需要写一个函数来求n a 的值,那么可以很容易地写成这样:

这就是递归函数的最简单形式,从中可以明显看出递归函数都有的一个特点:先处理一 些特殊情况——这也是递归函数的第一个出口,再处理递归关系——这形成递归函数的第二个出口。 递归函数的执行过程总是先通过递归关系不断地缩小问题的规模,直到简单到可以作为 特殊情况处理而得出直接的结果,再通过递归关系逐层返回到原来的数据规模,最终得出问题的解。 以上面求阶乘数列的函数)(n f 为例。如在求)3(f 时,由于3不是特殊值,因此需要计 算)2(*3f ,但)2(f 是对它自己的调用,于是再计算)2(f ,2也不是特殊值,需要计算 )1(*2f ,需要知道)1(f 的值,再计算)1(f ,1是特殊值,于是直接得出1)1(=f ,返回上 一步,得2)1(*2)2(==f f ,再返回上一步,得62*3)2(*3)3(===f f ,从而得最终解。 用图解来说明,就是 下面再看一个稍复杂点的例子。 【例1】数列}{n a 的前几项为

高中信息技术 算法与程序设计-递归算法的实现教案 教科版

递归算法的实现 【基本信息】 【课标要求】 (三)算法与问题解决例举 1. 内容标准 递归法与问题解决 (1)了解使用递归法设计算法的基本过程。 (2)能够根据具体问题的要求,使用递归法设计算法、编写递归函数、编写程序、求解问题。 【教材分析】 “算法的程序实现”是《算法与程序设计》选修模块第三单元的内容,本节课是“递归算法的程序实现”,前面学习了用解析法解决问题、穷举法解决问题、在数组中查找数据、对数进行排序以及本节的前一小节知识点“什么是自定义函数”的学习,在学习自定义函数的基础上,学习递归算法的程序实现是自定义函数的具体应用,培养学生“自顶向下”、“逐步求精”的意识起着重要的作用。 『递归算法在算法的学习过程中是一个难点,在PASCAL和C语言等程序语言的学习过程中,往往是将其放在“函数与过程”这一章节中来讲解的。递归算法的实现也是用函数或是过程的自我调用来实现的。从这一点上来讲,作者对教材的分析与把握是准确的,思路是清晰的,目标是明确的。』 【学情分析】 教学对象是高中二年级学生,前面学习了程序设计的各种结构,在学习程序设计各种结构的应用过程中培养了用计算机编程解决现实中问题的能力,特别是在学习循环语句的过程中,应用了大量的“递推”算法。前一节课学习了如何自定义函数,在此基础上学习深入学习和体会自定义函数的应用。以递推算法的逆向思维进行求解问题,在学习过程中体会递归算法的思想过程。多维度的思考问题和解决问题是提高学生的学习兴趣关键。 『递归算法的本质是递推,而递推的实现正是通过循环语句来完成的。作者准确把握了学生前面的学习情况,对递归算法的本质与特征也分析的很透彻,可以说作者对教学任务的分析是很成功的,接来就要看,在成功分析的基础上作者是如何通过设计教学来解决教学难点的了。』 【教学目标】

算法设计及分析递归算法典型例题

算法递归典型例题 实验一:递归策略运用练习 三、实验项目 1.运用递归策略设计算法实现下述题目的求解过程。 题目列表如下: (1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 (2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? 源程序: (3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼? (4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少? (5)猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子? (6)小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页? (7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子? 四、实验过程 (一)题目一:…… 1.题目分析 由已知可得,运动会最后一天剩余的金牌数gold等于运动会举行的天数由此可倒推每一 天的金牌剩余数,且每天的金牌数应为6的倍数。 2.算法构造 设运动会举行了N天, If(i==N)Gold[i]=N; Else gold[i]=gold[i+1]*7/6+i;

递归算法的优缺点

递归算法的优缺点: ○ 1优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 ○2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 边界条件与递归方程是递归函数的二个要素 应用分治法的两个前提是问题的可分性和解的可归并性 以比较为基础的排序算法的最坏倩况时间复杂性下界为0(n·log2n)。 回溯法以深度优先的方式搜索解空间树T ,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T 。 舍伍德算法设计的基本思想: 设A 是一个确定性算法,当它的输入实例为x 时所需的计算时间记为tA(x)。设Xn 是算法A 的输入规模为n 的实例的全体,则当问题的输入规模为n 时,算法A 所需的平均时间为 这显然不能排除存在x ∈Xn B ,使得对问题的输入规模为n 拉斯维加斯( Las Vegas )算法的基本思想: 设p(x) 是对输入x 调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x 均有p(x)>0。 设t(x)是算法obstinate 找到具体实例x 的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x 蒙特卡罗(Monte Carlo)算法的基本思想: 设p 是一个实数,且1/2

[转]递归算法详解

[转]递归算法详解 2009年09月05日星期六20:34 本文转至https://www.360docs.net/doc/6618726983.html,/blog/378483 C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这里有一个简单的程序,可用于说明递归。程序的目的是把一个整数从二进制形式转换为可打印的字符形式。例如:给出一个值4267,我们需要依次产生字符‘4’,‘2’,‘6’,和‘7’。就如在printf函数中使用了%d格式码,它就会执行类似处理。 我们采用的策略是把这个值反复除以10,并打印各个余数。例如,4267除10的余数是7,但是我们不能直接打印这个余数。我们需要打印的是机器字符集中表示数字‘7’的值。在ASCII码中,字符‘7’的值是55,所以我们需要在余数上加上48来获得正确的字符,但是,使用字符常量而不是整型常量可以提高程序的可移植性。‘0’的ASCII码是48,所以我们用余数加上‘0’,所以有下面的关系: ‘0’+ 0 =‘0’ ‘0’+ 1 =‘1’ ‘0’+ 2 =‘2’ ... 从这些关系中,我们很容易看出在余数上加上‘0’就可以产生对应字符的代码。接着就打印出余数。下一步再取商的值,4267/10等于426。然后用这个值重复上述步骤。 这种处理方法存在的唯一问题是它产生的数字次序正好相反,它们是逆向打印的。所以在我们的程序中使用递归来修正这个问题。 我们这个程序中的函数是递归性质的,因为它包含了一个对自身的调用。乍一看,函数似乎永远不会终止。当函数调用时,它将调用自身,第2次调用还将调用自身,以此类推,似乎永远调用下去。这也是我们在刚接触递归时最想不明白的事情。但是,事实上并不会出现这种情况。 这个程序的递归实现了某种类型的螺旋状while循环。while循环在循环体每次执行时必须取得某种进展,逐步迫近循环终止条件。递归函数也是如此,它在每次递归调用后必须越来越接近某种限制条件。当递归函数符合这个限制条件时,

递归算法详解

递归算法详解 C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这里有一个简单的程序,可用于说明递归。程序的目的是把一个整数从二进制形式转换为可打印的字符形式。例如:给出一个值4267,我们需要依次产生字符‘4’,‘2’,‘6’,和‘7’。就如在printf函数中使用了%d格式码,它就会执行类似处理。 我们采用的策略是把这个值反复除以10,并打印各个余数。例如,4267除10的余数是7,但是我们不能直接打印这个余数。我们需要打印的是机器字符集中表示数字‘7’的值。在ASCII码中,字符‘7’的值是55,所以我们需要在余数上加上48来获得正确的字符,但是,使用字符常量而不是整型常量可以提高程序的可移植性。‘0’的ASCII码是48,所以我们用余数加上‘0’,所以有下面的关系: ‘0’+ 0 =‘0’ ‘0’+ 1 =‘1’ ‘0’+ 2 =‘2’ ... 从这些关系中,我们很容易看出在余数上加上‘0’就可以产生对应字符的代码。接着就打印出余数。下一步再取商的值,4267/10等于426。然后用这个值重复上述步骤。 这种处理方法存在的唯一问题是它产生的数字次序正好相反,它们是逆向打印的。所以在我们的程序中使用递归来修正这个问题。 我们这个程序中的函数是递归性质的,因为它包含了一个对自身的调用。乍一看,函数似乎永远不会终止。当函数调用时,它将调用自身,第2次调用还将调用自身,以此类推,似乎永远调用下去。这也是我们在刚接触递归时最想不明白的事情。但是,事实上并不会出现这种情况。 这个程序的递归实现了某种类型的螺旋状while循环。while循环在循环体每次执行时必须取得某种进展,逐步迫近循环终止条件。递归函数也是如此,它在每次递归调用后必须越来越接近某种限制条件。当递归函数符合这个限制条件时,它便不在调用自身。 在程序中,递归函数的限制条件就是变量quotient为零。在每次递归调用之前,我们都把quotient除以10,所以每递归调用一次,它的值就越来越接近零。当它最终变成零时,递归便告终止。 /*接受一个整型值(无符号0,把它转换为字符并打印它,前导零被删除*/

递归算法的优缺点

○1优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 ○2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 边界条件与递归方程是递归函数的二个要素 应用分治法的两个前提是问题的可分性和解的可归并性 以比较为基础的排序算法的最坏倩况时间复杂性下界为0(n·log2n)。 回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。 舍伍德算法设计的基本思想: 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为 这显然不能排除存在x∈Xn使得的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有 拉斯维加斯( Las Vegas )算法的基本思想: 设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x均有p(x)>0。 设t(x)是算法obstinate找到具体实例x的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失败所需的平均时间,则有: 解此方程可得:

蒙特卡罗(Monte Carlo)算法的基本思想: 设p是一个实数,且1/2

算法分析及设计及案例习题解析

习题解析 第1章 1. 解析: 算法主要是指求解问题的方法。计算机中的算法是求解问题的方法在计算机上的实现。 2. 解析: 算法的五大特征是确定性、有穷性、输入、输出和可行性。 3. 解析: 计算的算法,其中n是正整数。可以取循环变量i的值从1开始,算i的平方,取平方值最接近且小于或者等于n的i即可。 4. 解析: 可以使用反证法,设i=gcd(m, n)=gcd(n, m mod n),则设m=a*i,n=b*i,且a与b互质,这时m mod n=(a-x*b)*i,只需要证明b和a-x*b互质,假设二者不互质,可以推出a与b不互质,因此可以得到证明。 5. 解析: 自然语言描述:十进制整数转换为二进制整数采用“除2取余,逆序排列”法。 具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 流程图:如图*.1

图*.1 十进制整数转换成二进制整数流程图 6. 解析: a.如果线性表是数组,则可以进行随机查找。由于有序,因此可以进行折半查找,这样可以在最少的比较次数下完成查找。 b.如果线性表是链表,虽然有序,则只能进行顺序查找,从链表头部开始进行比较,当发现当前节点的值大于待查找元素值,则查找失败。 7. 解析: 本题主要是举例让大家了解算法的精确性。过程中不能有含糊不清或者二义性的步骤。大家根据可行的方式总结一下阅读一本书的过程即可。 8. 解析: 数据结构中介绍的字典是一种抽象数据结构,由一组键值对组成,各个键值对的键各不相同,程序可以将新的键值对添加到字典中,或者基于键进行查找、更新或删除等操作。由于本题已知元素唯一,因此大家可以据此建立一个自己的字典结构。实现字典的方法有很多种: ?最简单的就是使用链表或数组,但是这种方式只适用于元素个数不多的情况下; ?要兼顾高效和简单性,可以使用哈希表; ?如果追求更为稳定的性能特征,并且希望高效地实现排序操作的话,则可以使用更为复杂的平衡树。

递归算法实例C源码

玩转算法与数据结构之递归算法 —HIT2000鲁天伟 递归算法在数据结构的树,图程序中都有应用。那么什么是递归算法呢。其实就是函数的自我调用。循环的在作一件事,把一个问题分成了可以重复的子问题去处理。递归这个词有两层含义,即递去和归来。递去,就是函数一层一层的在调用自己,我们在这里定义调用自己的函数为父函数,被调用的是子函数。父与子是个相对概念(参照二叉树中父结点与子结点来理解)。递去,何时结束呢,是要设定一个结束条件。那么这种结束条件的设置,第一种是设全局变量,全局变量随着每次自我调用在变化,当全局变量达到指定值或是全局变量参与的计算达到某个指定的值时结束。第二种是形参变量在被调用时达到指定值或形参参与的计算达到某个值时结束。第三种是当不满足自我调用条件时结束。这三种结束条件结合程序的需要可以组合使用。归来是指调用到某一次时,子程序执行结束了,子函数一层一层的把程序的执行权返还给自己的父函数,父函数执行所调用子函数的下一条命令。简单的递归,是一个函数体中调用自己一次,复杂的是在函数体中调用自己多次。 举一个字符串逆序输出的简单递归调用的例子如下图。 图表 1 递归函数调用

1、字符串逆序输出问题:将一个长为4的字符串逆序输出。代码如下: #include #define MAXSIZE 4 char data[MAXSIZE]; Rverse(int n){ if(n=3,F(1)=1,F(2)=1 代码如下: #include int Fib(int N){ if(N<=1) return N; else return Fib(N-1)+Fib(N-2); }

用递归法解决问题

用递归法解决问题 一、教材分析 “算法的程序实现”是高中信息技术教育出版社《算法与程序设计》选修模块第三单元的内容,本节课是“递归算法的程序实现”,前面学习了用解析法解决问题、穷举法解决问题、在数组中查找数据、对数进行排序以及本节的前一小节知识点“什么是自定义函数”的学习,,在学习自定义函数的基础上,学习递归算法的程序实现是自定义函数的具体应用,培养学生“自顶向下”、“逐步求精”的意识起着重要的作用。 课时安排:1课时 二、学情分析 教学对象是高中二年级学生,前面学习了程序设计的各种结构,在学习程序设计各种结构的应用过程中的培养了用计算机编程解决现实中的问题,特别的学习循环语句的过程中,应用了大量的“递推”算法。前一节课学习了如何自定义函数,在此基础上学习深入学习和体会自定义函数的应用。以递推算法的逆向思维进行求解问题,在学习过程中体会递归算法的思想过程。多维度的思考问题和解决问题是提高学生的学习兴趣关键。 三、教学目标 知识与技能: 1、理解什么是递归算法,学生用递归算法的思想分析问题 2、能够应用自定义函数方法实现递归算法的编程 过程与方法: 学生参与讨论,通过思考、动手操作,体验递归算法的方法 情感态度与价值: 结合数学中的实例,激发学生的数学建模的意识,培养学生多维度的思考问题和解决问题。 四、教学重点·难点 重点:理解什么是递归算法,学生用递归算法的思想分析问题 应用自定义函数方法实现递归算法的编程 难点:应用自定义函数方法实现递归算法的编程 五、教学过程

六、教学反思 从游戏的方式导入活动,充分的调动学生的思维,渐渐的走入了“递归的思维”模式,从而引出“猴子吃桃”,使用的前面活动(礼物是什么?)的思维,诱导学生进入了“递归”思想解题。学生阅读教材范例“裴波那契”,培养学生的自学能力、和知识迁移建构自我的知识体系。内化递归算法的实现,再由递归思维的逆向思维讨论“递推”的算法,进行比较计算机资源的耗费高,可读性差。为下一步导出结论做好了铺垫。 学好本节课的前提是:懂得自定义函数的使用方法,如果学生对自定义函数理解程度,是本节课效果是否得以完成的关键

递归算法经典案例

案例一: publicclass Fibonacci { //一列数的规则如下: 1、1、2、3、5、8、13、21、34 ,求第30位数是多少?使用递归实现 publicstaticvoid main(String[] args){ System.out.println(Fribonacci(9)); } publicstaticint Fribonacci(int n){ if(n<=2) return 1; else return Fribonacci(n-1)+Fribonacci(n-2); } } 案例二: publicclass Hanio1 { /* * 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说。开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒, * 第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上, * 规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。计算结果非常恐怖(移动圆片的次数)18446744073709551615, * 众僧们即便是耗尽毕生精力也不可能完成金片的移动了。 *要求:输入一个正整数n,表示有n个盘片在第一根柱子上。输出操作序列,格式为“移动 t从 x 到y”。每个操作一行,

*表示把x柱子上的编号为t的盘片挪到柱子y上。柱子编号为A,B,C,你要用最少的操作把所有的盘子从A柱子上转移到C柱子上。 */ publicstaticvoid main(String[] args){ int i=3; char a ='A',b='B',c='C'; hanio(i,a,b,c); } publicstaticvoid hanio(int n,char a,char b,char c){ if(n==1) System.out.println("移动"+n+"号盘子从"+a+"到"+c); else{ hanio(n-1,a,c,b);//把上面n-1个盘子从a借助b搬到c System.out.println("移动"+n+"号盘子从"+a+"到"+c);//紧接着直接把n搬动c hanio(n-1,b,a,c);//再把b上的n-1个盘子借助a搬到c } } } 案例三: publicclass Rabbit { /* 古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思指的是每个月的兔子总对数;假设将兔子分为小中大三种,兔子从出生后三个月后每个月就会生出一对兔子, 那么我们假定第一个月的兔子为小兔子,第二个月为中兔子,第三个月之后就为大兔子,那么第一个月分别有1、0、0,第二个月分别为0、1、0, 第三个月分别为1、0、1,第四个月分别为,1、1、1,第五个月分别为2、1、2,第六个月分别为3、2、3,第七个月分别为5、3、5…… 兔子总数分别为:1、1、2、3、5、8、13…… 于是得出了一个规律,从第三个月起,后面的兔子总数都等于前面两个月的兔子总

用递归法解决问题

3.5用递归法解决问题 【教材分析】 “用递归法解决问题”是《算法与程序设计》第三章第5节的内容,学业水平测试对本节内容也达到了B级要求,本节内容是在学习了VB基础知识中的三种基本结构,并且学习了数组、用解析法和穷举法解决问题等算法。本节先后介绍了“什么是递归法”、“自定义函数”、以及应用自定义函数结合递归算法来解决问题实例。通过本节内容的学习可以培养学生分析和分解问题的能力。从教材的结构上看“自定义函数”和“递归算法”是独立的,可以分别讲解,但在使用时两者是相辅相成的。 【学情分析】 这节课的教学对象是高中二年级学生,已经学习了算法与程序设计VB中的一些基础知识,初步了解了算法的概念。特点是在学习循环结构的过程中,学生已经积累了一些“递归”和“穷举”的算法。但是学生对函数尤其是“自定义函数”非常陌生,而“自定义函数”和“递归法”是本册的学习重点,也是以后编程的重点。学习本节内容学生可以充分体会递归算法的思想过程,扩大原来的知识面,进一步认识程序设计的功能,进一步激发学生学习算法与程序设计的兴趣。 【教学目标】 1.知识与技能: 理解什么是递归法,会用递归法的思想分析和解决问题 理解什么是自定义函数,能应用自定义函数实现递归算法的编程 2.过程与方法 学生通过思考、探究,体验递归算法和发现问题与解决问题的步骤 3.情感态度与价值观 在建立数学模型中培养学生的抽象思维能力,培养学生多维度思考问题和解决能力。 树立多学科整合的思想意识,能够用联系的观点解决问题。 【教学重点】 理解什么是递归算法,学会用递归法的思想分析问题。 理解自定义函数的概念。 【教学难点】 用自定义函数和递归算法编写程序解决问题 【教学方法及策略】

JAVA递归算法实例小结

package com.zf.s2;// 创建一个包 import java.math.BigInteger;// 导入类 import java.util.ArrayList; import java.util.List; public class TextFactorial {// 操作计算阶乘的类 public static int simpleCircle(int num){// 简单的循环计算的阶乘int sum=1; if(num<0){// 判断传入数是否为负数 throw new IllegalArgumentException(" 必须为正整数} for(int i=1;i<=num;i++){// 循环num sum *= i;// 每循环一次进行乘法运算 } return sum;// 返回阶乘的值 } public static int recursion(int num){// 利用递归计算阶乘int sum=1; if(num < 0) throw new IllegalArgumentException(" 必须为正整数if(num==1){ return 1;// 根据条件,跳出循环 }else{ sum=num * recursion(num-1);// 运用递归计算 return sum; } } public static long addArray(int num){// 数组添加计算阶乘long[]arr=new long[21];// 创建数组arr[0]=1; int last=0; if(num>=arr.length){ throw new IllegalArgumentException(" 传入的值太大} if(num < 0) throw new IllegalArgumentException(" 必须为正整数while(last

递归算法实例

递归算法实例 忘记关窗子给冷风吹醒了,额!前段时间研究PHP,关于递归有个例题“馋嘴猴子”。说有只猴子弄到了一堆桃子,它第一天吃了这堆的一半,还觉得不过瘾,出门的时候又吃了一个,第二天吃了剩下的桃子的一半再加一个,每天都这样,第十天准备吃的时候,发现桃子只剩一个了,问最初一共有多少个桃子。 问题并不复杂,但是要用倒着推的方式,第十天的桃子数量1也就是第九天剩下的数量,设第九天桃子数量为X,则有等式:X/2-1=1,解得:X=4。以此类推可以算出最初的桃子数量。 用编程的方式解决这个问题,有两种推导方式,“迭代”和“递归”。今天主要说说编程中递归,递归说白了就是函数自己调用自己,这种流程控制方法和“迭代”一样,都是用在代码执行步进中,后一步的计算结果当做前一步计算参数的时候。 “递归”的关键是出口,就是结束递归的条件,条件设置不合适,容易死循环。 来个简单的例子----阶乘,阶乘就是自然数从1乘到自己本身,比如3的阶乘,就是1x2x3=6。用VBA实现,按正常的流程做法应该是: Function Factorial0(ByVal num As Integer) Dim i As Long Factorial0 = 1 For i = 1 To num Factorial0 = Factorial0 * i Next i End Function 这么写也无可厚非,比较容易理解,用递归写阶乘代码是下面这样的: Function Factorial(ByVal num As Integer) If num = 1 Then '这里设置的是递归的出口,NUM是1就结束 Factorial = 1 Else Factorial = num * Factorial(num - 1) '这里是重点,自己调用自己,变量NUM减1 End If End Function

高中信息技术_4.5递归算法与递归程序教学设计学情分析教材分析课后反思

《递归算法与递归程序》教学设计 一、教学目标 1、知识与技能 1)能够从思想和特点上理解什么是递归算法 2)学会分析问题,能够建立合理的的递归数学模型 3)能够自主设计递归函数解决实际问题 2、过程与方法: 1)通过分析身边的实例,理解递归算法的思想和特点 2)通过通过层递的案例,理清递归法解决问题的过程 3、情感态度与价值观: 1)通过实际问题的解决,激发学生数学建模的意识和设计方法2)通过学习新的思维方式,培养学生多维度思考和解决问题的意识 3)通过对递归算法解决问题的效率分析,使学生能更全面的认识和理解递归算法 二、教学重点与难点 1、教学重点 1)理解什么是递归算法 2)能够建立合理的的递归数学模型 3)能够设计递归函数解决实际问题 2、教学难点:

1)能够建立合理的的递归数学模型 2)能够设计递归函数解决实际问题 三、教学方法 主要采用讲授法、演示法、案例分析法、任务驱动法。 四、教学过程

1、让学生演示常用报 数方式。引导学生分 析得出答案的过程。引出递推思想。 2、让学生演示一种另 类的报数方式。引导 学生分析得出答案的过程。引出递归思 想。 递归法,相对于学 生来说是比较抽象 的,通过学生的两种演示、分析,能让学生从感性上对递归思想有一个形 象的认识,从而能 够更好的展开本节 课的学习。 (或过程) 倾听、分析思考 通过展示递归定义,让学生从概念

s as As 该案例与报数游 戏思路完全一致,学生很容易找出关系式,建立数学模型。 通过进一步分析递归函数,让学生理解什么是自身调用自身?什么是递和归?

通过案例1的学习分析,了解了递归思想,进而以归纳的方式展示递归思想的内涵,有助于学生更好的把握递归思想。

递归算法的介绍

递归应用实例介绍 姓名:周凡专业:计算机科学与技术09级5班学号:09999035 关键词递归汉诺塔斐波那契数列快速排序 递归之所以能作为一种算法在程序设计语言中广泛应用,主要在于采用递归编写程序能使程序变得简洁和清晰.。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。说得直接一点,递归就是在过程或函数里调用自身。 下面,从本人掌握的编程知识,介绍几个使用递归算法的实例。 汉诺塔问题是源于印度一个古老传说的益智玩具。上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时, f(64)= 2^64-1=18446744073709551615 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下, 18446744073709551615/31556952=584554049253.855年,显然这是人力所不能及的,但是使用递归算法可以很快的解决问题首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C; 若n为奇数,按顺时针方向依次摆放 A C B。 (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

递归算法的实现教学设计

《递归算法》教学设计 蚌埠新城实验学校徐田柱 一、教学三维目标 知识与技能: 1、理解什么是递归算法,学生用递归算法的思想分析问题、解决问题 2、能够应用自定义函数方法实现递归算法的编程 过程与方法: 学生参与讨论,通过思考、动手操作,掌握递归算法 情感态度与价值: 结合数学中的实例,激发学生的数学建模的意识,培养学生多维度的思考问题和解决问题。 二、教学重点与难点 重点: 理解什么是递归算法,学生用递归算法的思想分析问题、解决问题 应用自定义函数方法实现递归算法的编程 难点: 应用自定义函数方法实现递归算法的编程 三、教学策略教 递归算法的实现思想是比较抽象,比较理论化的教学内容。本着培养学生的发现问题、分析问题、解决问题的意识与能力入手。知识主要是靠学生学会的,学习就是发生在学生头脑的建构。因此,教师必须明确学生是学习的主体,研究

学生学习的真实心理活动,分析其认识过程、机制及心智变化。确定教学方法。 四、教学环境 网络教室,教学软件DEV C++,大屏幕投影; 五、教学资源准备 从本学科的特点、学生的认知水平及学习心理特征,更好的激发学生的学习动机与信心,为保持学生的学习激情,设计了一系列难度层层递进的例题和练习。 六、教学过程 (一)情景导入,提出课题 师:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚在讲故事,他讲的故事是:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚在讲故事…… 师:这个故事体现了我们以前提到过的哪种程序设计算法? 生:递归算法 师:是的,引入课题,本节课我们就来深入学习递归算法。 设计意图:用故事引入课题,便于学生理解。 (二)新课探究,导出递归算法程序设计思想 (1)例题1: 求:f(n)=1+2+3+·(n-1)+n 学生很容易想到以前学过的迭代算法: s=0; For(i=1;i<=n;i++) s=s+i; 老师提出递归表达式:

4.5.2应用递归算法解决问题的经典例子

《利用递归调用解决汉诺塔问题》课后反思 本节课授课对象是高二年级学生,学生有较强的逻辑思维能力,以及scratch编程的基本能力,这些都对学生完成本节课内容做了良好的铺垫。 本节课亮点: 1、本节课主要教学内容为递归思维,通过Excel小游戏导入,层层问题引导,让学生逐步从发现问题、分析问题、数学建模、算法描述、程序实现等几步来理解解决汉诺塔问题的思维过程。通过具体案例,培养学生解决问题的思维算法,并且最后到理解现实问题解决步骤的思维算法,完成知识的建构与升华。 2、在讲述本节课时,以scratch编程软件做载体,主要出发点是scratch 软件,对于软件需要记忆的语法规则较少,对于每周一次的信息技术课来说,学生比较容易学习和操作。 3、本节课利用手机进行ppt控制,让教师脱离电脑束缚,走入学生中间,及时了解学生对于知识点的理解情况,能做到有的放矢的教学效果。 不足之处: 1、对于学生回答问题鼓励与评价有所不足,造成学生在回答问题 积极性不高。 2、教学过程中有些赶时间,尤其在从数学建模到算法描述这步重 要的过程,没有留给学生思考时间,直接讲解,这样的操作会对教学效果有大大折扣。

3、没有充分调动学生积极性,主要体现在教学活动中,学生之间 的互帮活动较少,造成部分学生没能跟上教学的节奏。 4、对于本节课程序实现这步,难度估计有所不足,备学生不到位, 对于过程参数的使用,许多学生没有分清过程参数中数字与字符串的区别,造成学生在调用时,出现很多问题,这部分内容是自己在前面教学中有所“欠账”造成的。 总得来说,本节课还是比较成功的一节课,从游戏的导入,中间的层层问题引导,再到最后的思维升华等,学生在本节课中不仅仅学会操作和编程,更重要的是学会了利用计算思维解决问题的过程和能力。

相关文档
最新文档