递归算法递归不是一种数据结构还是一种有效的算法设计方法递归算法是指算法直接或间接地调用其本身学习教案.pptx
上传人:王子****青蛙 上传时间:2024-09-13 格式:PPTX 页数:23 大小:207KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

递归算法递归不是一种数据结构还是一种有效的算法设计方法递归算法是指算法直接或间接地调用其本身学习教案.pptx

递归算法递归不是一种数据结构还是一种有效的算法设计方法递归算法是指算法直接或间接地调用其本身学习教案.pptx

预览

免费试读已结束,剩余 13 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

会计学许多应用问题的算法(suànfǎ),用递归来定义或描述,概念更清晰。比如:⑴n!的定义:⑵问题的解决(jiějué)存在自调用在有序数组a中查找数据元素k是否存在的折半查找算法。查找思想用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。⑴取中间位置Mid:Mid=(Low+High)/2;⑵比较中间位置记录的关键字与给定的K值:①相等:查找成功;②大于:待查记录在区间的前半段,修改上界指针:High=Mid-1,转⑴;③小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1,转⑴;直到越界(yuèjiè)(Low>High),查找失败。算法示例如图6-1(a),(b)所示。查找21查找71在用计算机实现递归算法时,必须是有限的。为了防止递归调用无终止地进行,必须有终止递归调用的条件(tiáojiàn),一旦满足该条件(tiáojiàn)后就不再进行递归,然后逐层返回。例:计算n!。/*递归调用计算阶乘*/longfact(intn){longf;if(n>1)f=fact(n-1)*n;elsef=1;return(f);}intBin_Search(inta[],intkey,intlow,inthigh){intMid;if(Low>High)return(-1);//查找(cházhǎo)失败Mid=(low+high)/2;if(key==a[Mid])return(Mid);//查找(cházhǎo)成功elseif(key<a[Mid])returnBin_Search(a,key,Low,Mid-1);//在前半区递归查找(cházhǎo)elsereturnBin_Search(a,key,Mid+1,high);//在后半区递归查找(cházhǎo)}#include<stdio.h>main(void){inta[]={1,3,4,5,9,17,18,25,31,33,57};intx=17;intpos;pos=BSearch(a,x,0,11);if(bn==-1)printf("x不在数组a中");elseprintf("x在数组a的下标(xiàbiāo)%d中",pos);}基本思想:将一个较为复杂的问题,分解成若干个相对简单且类同的子问题,这样就可递推得到解。能用递归算法(suànfǎ)求解的问题的充分必要条件是:⑴问题具有某种可借用的类同自身的子问题描述的性质;⑵某一有限步的子问题(也称作本原问题)有直接的解存在。当一个问题具有上述两个基本要素时,该问题就可以用递归算法(suànfǎ)解决。递归算法的设计方法⑴把对原问题的求解设计成包含有对子问题求解的形式。⑵设计递归出口。设计举例:设计模拟汉诺塔问题求解过程(guòchéng)的算法。问题描述:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每一个都比下面的略小一点,要求把A柱上的盘子全部移到C柱上。移动规则:①一次只能移动一个盘子;②移动过程(guòchéng)中大盘子不能放在小盘子上面;③移动过程(guòchéng)中盘子可以放在任意一个柱子上。问题分析:可以用递归方法求解n个盘子的汉诺塔问题。基本思想:1个盘子的汉诺塔问题可直接移动。n个盘子的汉诺塔问题可递归表示(biǎoshì)为:首先把上边的n-1个盘子从A柱移到B柱,然后把最下边的一个盘子从A柱移到C柱,最后把移到B柱的n-1个盘子再移到C柱。4个盘子汉诺塔问题的递归求解示意图如图6-2所示。图6-2汉诺塔问题(wèntí)的递归求解示意图算法设计:①盘子的个数n一个输入参数。对n个盘子,可从上至下依次编号为1,2,…,n;②输入参数还需有3个柱子的代号。令3个柱子的参数名分别(fēnbié)为fromPeg,auxPeg和toPeg;③汉诺塔问题的求解是一个处理过程。则算法的输出是n个盘子从柱子fromPeg借助柱子auxPeg移动到柱子toPeg的移动。voidtowers(intn,charfromPeg,chartoPeg,charauxPeg){if(n==1)//递归出口(chūkǒu){printf("%s%c%s%c\n","movedisk1frompeg",fromPeg,"topeg",toPeg);return;}//把n-1个圆盘从fromPeg借助toPeg移至auxPegtowers(n-1,fromPeg,auxPeg,toPeg);//把圆盘n由fromPeg直接移至toPegprintf("%s%d%s%c%s%c\n","movedisk"