数据结构专接本复习纲要4.docx
- 文档编号:27140929
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:10
- 大小:18.08KB
数据结构专接本复习纲要4.docx
《数据结构专接本复习纲要4.docx》由会员分享,可在线阅读,更多相关《数据结构专接本复习纲要4.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构专接本复习纲要4
“数据结构”专接本复习纲要2006.1
第四章递归
一、递归的概念
1、什么是递归
我们知道,在程序中某个A函数(过程)的执行中可以调用另一个B函数(过程),而在B函数的执行过程中又可以调用另一个C函数(过程)。
这叫做函数(过程)的嵌套调用。
如果在函数嵌套调用的过程中,一个调用者函数(主调函数)自身成了被调用函数(被调函数),则说,发生了函数递归调用的现象。
简称发生了递归。
简言之,递归就是允许程序调用自己本身的过程或函数。
2、递归的种类
递归分两种:
间接递归和直接递归。
所谓间接递归是指函数A调用了函数B,在函数B嵌套调用其它函数的过程中,发生了调用函数A的情况,就说,函数A发生了间接递归,或说函数A是一个间接递归函数。
所谓直接递归是函数A在执行过程中调用了A自身。
我们现在学习的递归都是直接递归。
3、构成递归需具备的条件
(1)子问题须与原始问题为同样的事,且更为简单。
(2)不能无限制地调用本身,需有个出口,化简为非递归处理。
所谓递归的出口是指使函数不再调用自身的判别条件。
也就是说,符合此条件后,函数可以不用再调用自身了,一般情况下,此时函数可以得到明确的处理结果了。
4、递归程序与非递归程序的差异
递归程序与非递归程序的主要差别在于返回数据和保存递归函数调用现场的内存需求量。
因为递归函数在执行时一般要多次调用函数自身或其它函数,所以它比非递归函数需要更多的空间来存放每次调用函数时的现场保存和函数返回值的保存。
由于多次调用函数,因此,要花费较多的机器时间。
所以,一般而言,一个递归函数和完成相同功能的非递归函数相比,递归函数在空间和时间的效率上都比非递归函数低。
但一般递归函数比非递归函数构造简洁,代码短,可读性好。
下面用一个表对比二者。
递归
非递归
程序可读性
易
难
代码量大小
小
大
运行时间
长
短
占用stack
大
小
5、递归与循环的比较
一般递归都可以化成等价的非递归的循环。
循环是反复执行某些条件,直到符合所指定条件为止,但不包含调用函数自身。
循环和递归的差异:
〈1〉循环用while(for)递归用if…else来控制循环。
〈2〉递归用较多的参数及较少的局部变量。
二、递归执行过程的分析
1、计算阶乘
阶乘的计算可以用以下递归的函数定义来表示:
1若n=0
f(n)=
n*f(n-1)若n>0
据此,可以写出如下计算阶乘的递归函数longfact(intn)
longfact(intn)
{longt;
(1)if(n==0)t=1;
(2)elset=n*fact(n-1);
(3)returnt;
}
n=4n=3n=2n=1n=0
4==0F3==0F2==0F1==0F0==0T1
fact(4)4*fact(3)3*fact
(2)2*fact
(1)1*fact(0)递归出口
4*63*22*11*11
递归调用回代
注意,虽然递归调用每次调用的都是自身,但每次调用是实参发生了变化,这在分析递归执行过程中很重要。
类似地,求1+2+3+…+n的递归过程如下
intsum(intn)
{if(n==1)return1;
elsereturnn+sum(n-1);
}求sum(10)的值
类似地,求xn(n为整数,x≠0)的递归函数表示如下
1x=0
p(x)=x*p(x-1)x>0
p(x+1)/xx<0据此,设计递归函数如下
floatp(intx)
{if(n==0)return1;
elseif(n>0)returnx*p(x-1);
elsereturnp(x+1)/x;
}
2、数制转换
将10进制数转换成8进制数打印输出的递归函数可以表示如下:
打印结束若x=0
pr10_8(x)=
pr10_8(x/8)若x>0,先打印x/8的转换
打印x%8结果,再打印x%8
voidpr10_8(intx)
/*10进制数x转换成8进制数打印的递归函数*/
{1if(x>0)/*若x>0*/
2{tr10_8(x/8);/*先调用自身去x/8的转换结果*/
3printf(“%d”,x%8);/*转换完x/8后,再打印x%8*/
}
4return;/*递归出口是x<=0*/
}
假设要转换十进制数100,递归调用示意如下:
pr10_8(100)pr10_8(12)pr10_8
(1)
x=100x=12x=1x=0
1100>0112>011>010>0
2pr10_8(100/8)2pr10_8(12/8)2pr10_8(1/8)
3打印100%83打印12%83打印1%8
4返回4返回4返回4返回
先打印1%8,再打印12%8,最后打印100%8
144
3、递归程序例
(1)
voidp(intw)
{1if(w>0)
2{p(w-1);
3printf(“%d”,w);
}
4return;
}
w=4w=3w=2w=1w=0
14>013>012>011>010>0
p(4)2p(4-1)2p(3-1)2p(2-1)2p(1-1)
3打印43打印33打印23打印1
4返回4返回4返回4返回4返回
打印顺序1234
4、递归程序例
(2)
voidp(intw)
{1if(w>0)
2{p(w-1);
3printf(“%d”,w);
4p(w-1);
}
5return;
}
121312141213121
以上是p(4)的输出,其中
1是p
(1)的输出,121是p
(2)的输出,
1213121是p(3)的输出
w=4w=3w=2w=1w=0
14>013>012>011>011>0
2p(4-1)2p(3-1)2p(2-1)2p(1-1)5返回
p(4)3打印43打印33打印23打印1w=0
4p(4-1)4p(3-1)4p(2-1)4p(1-1)11>0
5返回5返回5返回5返回5返回
p(4)p(3)p
(2)p
(1)p(0)
执行过程执行过程执行过程执行过程执行过程
12131214121312112131211211
p(4)
p(3)4p(3)
p
(2)3p
(2)p
(2)3p
(2)
p
(1)2p
(1)p
(1)2p
(1)p
(1)2p
(1)p
(1)2p
(1)
p(0)1p(0)p(0)1p(0)p(0)1p(0)p(0)1p(0)p(0)1p(0)p(0)1p(0)p(0)1p(0)p(0)1p(0)
试写出对以下两个函数做调用p(4)的输出结果
voidp(intw)
{1if(w>0)
2{printf(“%d”,w);
3p(w-1);
4p(w-1);
}
5return;
}432112113211211
voidp(intw)
{1if(w>0)
2{p(w-1);
3p(w-1);
4printf(“%d”,w);
}
5return;
}112112311211234
5、汉诺塔问题
ABC
1A(C)B
(1)AB1
2A(B)C
(2)AC2
1B(A)C
(1)BC3
3A(C)B(3)AB4
1C(B)A
(1)BC5
2C(A)B
(2)CB6
1A(C)B
(1)AB7
4A(B)C(4)AC8
1B(A)C
(1)CA9
2B(C)A
(2)BA10
1C(B)A
(1)CA11
3B(A)C(3)BC12
1A(C)B
(1)AB13
2A(B)C
(2)AC14
1B(A)C
(1)BC15
12345
(1)AB
(2)AC
(1)BC(3)AB
(1)CA
678910
(2)CB
(1)AB(4)AC
(1)BC
(2)BA
1112131415
(1)CA(3)BC
(1)AB
(2)AC
(1)BC
121312141213121
4
33
2222
11111111
voidhanoi(intn,intA,intB,intC)
{hanoi(n-1,A,C,B);
move(A,C);
hanoi(n-1,B,A,C);
}
6、最大公约数问题
求最大公约数的递归函数可以定义如下
y若x%y=0
gcd(x,y)=
gcd(y,x%y)若x%y≠0
根据以上函数的递归定义设计如下求最大公约数的递归函数。
/*用递归函数求两个正整数的最大公约数*/
intgcd(inta,intb)
{intt;
if(a%b==0)t=b;
/*若a整除b,则b是所求的最大公约数*/
elset=gcd(b,a%b);
/*否则,调用自身求b和a%b的最大公约数*/
returnt;
}
递归调用回代
gcd(54,16)gcd(16,6)gcd(6,4)gcd(4,2)得函数值2
54,1616,66,44,2
54%16=616%6=46%4=24%2=0
gcd(54,16)gcd(16,6)gcd(6,4)gcd(4,2)
t=2t=2t=2t=2
7、逆序打印字符串
voidinv_pr_str(char*s)
{if(*s)
{inv_pr_str(s+1);
putchar(*s);
}
return;
}请自己分析。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习 纲要