数据结构专接本复习纲要4docx.docx
- 文档编号:28201156
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:11
- 大小:268.10KB
数据结构专接本复习纲要4docx.docx
《数据结构专接本复习纲要4docx.docx》由会员分享,可在线阅读,更多相关《数据结构专接本复习纲要4docx.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构专接本复习纲要4docx
“数据结构乃专接本复习纲要2006.1
第四章递归
一.递归的概念
K什么是递归
我们知道,在程序中某个A函数(过程)的执行中可以调
用另一个C函数(过程)。
这叫做函数(过程)的嵌套调用。
如果在函数嵌套调用的过程中,一个调用者函数(主调函
数)自身成了被调用函数(被调函数),则说,发生了函数递归调用的现象。
简称发生了递归。
简言之,递归就是允许程序调用自己本身的过程或函数。
2、递归的种类
递归分两种:
间接递归和直接递归。
所谓间接递归是指函数A调用了函数B,在函数B嵌套
调用其它函数的过程中,发生了调用函数A的情况,就说,函数A发生了间接递归,或说函数A是一个间接递归函数。
所谓直接递归是函数A在执行过程中调用了A自身。
我们现在学习的递归都是直接递归。
3、构成递归需具备的条件
(1)子问题须与原始问题为同样的事,且更为简单。
(2)不能无限制地调用本身,需有个出口,化简为非递归处理。
所谓递归的出口是指使函数不再调用自身的判别条件。
也就是说,符合此条件后,函数可以不用再调用自身了,一般情
况下,此时函数可以得到明确的处理结果了。
4、递归程序与非递归程序的差异
递归程序与非递归程序的主要差别在于返回数据和保存
递归函数调用现场的内存需求量。
因为递归函数在执行时一般要多次调用函数自身或其它函数,所以它比非递归函数需要更多的空间来存放每次调用函数时的现场保存和函数返回值的保存。
由于多次调用函数,因此,要花费较多的机器时间。
所以,一般而言,一个递归函数和完成相同功能的非递归
函数相比,递归函数在空间和时间的效率上都比非递归函数低。
但一般递归函数比非递归函数构造简洁,代码短,可读性好。
下面用一个表对比二者。
递归
非递归
程序可读性
易
难
代码量大小
小
大
运行时间
长
短
占用stack
大
小
5、递归与循环的比较
一般递归都可以化成等价的非递归的循环。
循环是反复执行某些条件,直到符合所指定条件为止,但
不包含调用函数自身。
循环和递归的差异:
⑴循环用while(for)递归用if...else来控制循环。
〈2〉递归用较多的参数及较少的局部变量。
二、递归执行过程的分析
1、计算阶乘
阶乘的计算可以用以下递归的函数定义来表示:
f(n)=<
若n=0
若n>0
longfact(intn)
{longt;
(1)if(n==0)t=l;
(2)elset=n*fact(n-l);
(3)returnt;
(4)
}
回代
递归调用
注意,虽然递归调用每次调用的都是自身,但每次调用是实参发生了变化,这在分析递归执行过程中很重要。
类似地,求l+2+3+・・・+n的递归过程如下
intsum(intn)
{if(n==l)return1;
elsereturnn+sum(n-l);
}求sum(10)的值
■1
x=0
P(x)=<
x*p(x-l)
x>0
、p(x+l)/x
x<0
据此,设计递归函数如下
float
p(intx)
{ifd
i==0)
return
1;
elseif(n>0)
return
x*p(x-l);
else
}
return
p(x+l)/x;
类似地,
求xn(n为整数,xHO)的递归函数表示如下
2、数制转换
将10进制数转换成8进制数打印输出的递归函数可以表
示如下:
prl0_8(x)=v
{trl0_8(x/8);/*先调用自身去x/8的转换结果*/printf(“%d”,x%8);/*转换完x/8后,再打印x%8*/
}
voidprl0_8(intx)
/*10进制数X转换成8进制数打印的递归函数*/
{1if(x>0)/*若x>0*/
2
return;/*递归出口是x<=0*/
}
2prl0_8(100/8)J
3打印f00%8_
4返回
2pi40_8(12/8尸
3打印"12%8-
4返回
2prl0_8(l/8)
3打由1%8
4返回
4返回
假设要转换十进制数100,递归调用示意如下:
先打印1%8,再打印12%8,最后打印100%83、递归程序例
(1)
voidp(intw)
{1if(w>0)
2{p(w-1);
3printf(u%d,,,w);
}
4
return;
打印顺序
1234
4>递归程序例
(2)voidp(intw)
{1if(w>0)
2{p(w-1);
3printf(“%d”,w);
4p(w-1);
}
5return;
m2辽|3口2口|4|口2口|3|口2口|
以上是p(4)的输出,其中
p(i)的输出,回2辽|是p
(2)的输出,
酉2口3乜2是p⑶的输出
P(4)
J,
I
4p(3)
1
P⑵3
~1
P⑵
p
(2)
3
p⑵
1
1
1
1
P⑶
p(l)2p(l)
p⑴2p(l)p(l)2p(l)
2P(l)
(0)p(b)Q)p(b)i扁)p(b)ip(3)p(b)ih)P(6)ip(i)p(6)ip
(1)P(b)i7Jo)
p
121312*********1213121121
试写出对以下两个函数做调用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;
}112112*********
5、汉诺塔问题
4AIW)—C〈(4)Ar>c8
-IB-(A讦2
(1)C&A9
All
f2BI(c)IA
(2)B&A10
1C(B)(A&(l)c亠
VB—(A)—c(3)B&C12
、1A—(CTB13
2AIW)—C」
(2)A&C141BI(A)ICQ)B&C15
、2A-(BTC
(3)A*B4
2cl(AYw
(2)A>C2
19(BTA(1W&C5
(2)c&B6
1了(CTB
(1)A>B7
1
2
3
4
5
(1)4B
(2)A〜C
⑴BtC
(3)A~B
(1)3A
6
7
8
9
10
⑵3B
(l)A^B
⑷A—C
⑴"C
(2)B9A
11
12
13
14
15
⑴C—A
(3)BTC
(1)A~B
(2)C
(1)B~C
21
312
14
121
3121
4
1
3
3
^JL
1
1
n
1
1
2
2
2
2
1111111
voidhanoi(intn9intA,intB,intC){hanoi(n-1,A,C,B);
move(A,C);
hanoi(n-l,B,A,C);
6、最大公约数问题
求最大公约数的递归函数可以定义如下
「y若x%y=O
gcd(x,y)=v
、gcd(y,x%y)若x%yHO
根据以上函数的递归定义设计如下求最大公约数的递归
函数。
/*用递归函数求两个正整数的最大公约数引
intgcd(inta,intb)
{intt;
if(a%b=O)t二b;
/*若a整除b,则b是所求的最大公约数*/
elset二gcd(b,a%b);
/*否则,调用自身求b和a%b的最大公约数V
returnt;
}
f递归调用—回代
gcd(54,16)_gcd(16,6)—gcd(6,4)_gcd(4,2)得函数值2
p54,16
n1696
n6“
54%16=6
16%6=4
6%4=2
4%2=0
gcd(16,6)・
<
t=2i
—
gcd(6,4)一・
<
t=2|
gcd(4,2)-
<—
t=21
—
=2|
1
1—
1
gcd(54,16)
<
7.逆序打印字符串
voidinv_pr_str(char*s)
{if(*s)
{inv_pr_str(s+l);putchar(*s);
}
return;
}请自己分析。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习 纲要 docx