LogoLogo 程序设程序设计计
( 授课讲稿 ) 吴剑辉
第五讲 复杂递归 递归是一种思维、推理和解决问题的方法。递归解决的是规律性很强的问题,只要“略微简化的同类问题”可以解决。即,“自顶而下,步步求精”的方法。 递归调用语句出现在过程体的不同位置(尾部、头部或中间)分为尾部递归、首部递归和中部递归三种,后两者是较复杂。
一、深入了解递归
二、画二叉树学起
三、多阶递归过程
一、深入了解递归1 、实例对照:设计倒计数和正计数过程。
TO DJS :N IF :N<1 STOP PR :N DJS :N-1 END
TO ZJS :N IF :N<1 STOP ZJS :N-1 PR :NEND
? DJS 5 ↙ ? ZJS 5 ↙54321
12345
用尾部递归方式编写过程。
用首部递归方式编写过程。
想一想:求⑴、 100+99+98+…+2+1 100
1
99
1...
3
1
2
11 ⑵ 、
2 、实例对照:画逐层减半的正方形内切圆(如图)。 用尾部递归方式编写过程:TO ZQY1 :S IF :S<20 STOP REPEAT 4[FD :S/2 RT 90 FD :S/2] REPEAT 360[RT 0.5 FD :S/2*PI/180 RT 0.5] WAIT 100 ZQY1 :S/2 WAIT 100END
用中部递归方式编写过程:TO ZQY2 :S IF :S<20 STOP REPEAT 4[FD :S/2 RT 90 FD :S/2] WAIT 100 ZQY2 :S/2 WAIT 100 REPEAT 360[RT 0.5 FD :S/2*PI/180 RT 0.5]END
用尾部递归方式编写过程:TO ZQY3 :S IF :S<20 STOP REPEAT 4[FD :S/2 RT 90 FD :S/2] REPEAT 360[RT 0.5 FD :S/2*PI/180 RT 0.5] PU FD 0.75*:S PD WAIT 100 ZQY3 :S/2 WAIT 100END
用中部递归方式编写过程:TO ZQY4 :S IF :S<20 STOP REPEAT 4[FD :S/2 RT 90 FD :S/2] PU FD 0.75*:S PD WAIT 100 ZQY4 :S/2 WAIT 100 PU BK 0.75*:S PD REPEAT 360[RT 0.5 FD :S/2*PI/180 RT 0.5]END
3 、实例说明:在一个过程体中允许多次的递归调用。 ⑴ 、二次递归过程。 ⑵ 、三次递归过程。
TO S1 :L IF :L<10 STOP FD :L LT 35 S1 :L/2 RT 70 S1 :L/2 LT 35 BK :LEND
TO S2 :L IF :L<10 STOP FD :L LT 70 S2 :L/2 RT 70 S2 :L/2 RT 70 S2 :L/2 LT 70 BK :LEND
⑶ 、四次递归过程。TO S3 :L IF :L<10 STOP FD :L LT 75 S3 :L/2 RT 50 S3 :L/2 RT 50 S3 :L/2 RT 50 S3 :L/2 LT 75 BK :LEND
? S1 100↙
? S2 100↙
? S3 100↙
二、画二叉树学起 1 、叉树问题 :以树杈交点(即节点)为界分层,每个节点都分出呈 V 形的树枝,这是一种复杂而有规律的基本图形。也是一种比较典型较复杂的递归问题。
⑴ 、第一步:画树杈 (如右图)。TO SHU :B :J LT :J/2 FD :B BK :B RT :J FD :B BK :B LT :J/2END
? SHU 100 60↙
【指导说明】: 画完树杈后,海龟要回到原来起始的位置和方向。
⑵ 、第二步:画二叉树。 ( 编程步骤 )
【编程关键】: 寻找生叉点并逐一在此处添加递归调用命令。
TO SHU :B :J LT :J/2 FD :B BK :B RT :J FD :B BK :B LT :J/2END
SHU :B/2 :J
IF :B<10 STOP
SHU :B/2 :J
“ 递归”插入点
? SHU 80 60 4↙
? SHU 80 60 4↙
2 、深入探究:从创造思维入手,运用 “图形想象” 的方法去思维、推理和解决问题。在搞清楚 “二叉树问题”的基础上, 经过变形的各种树的问题就易解。从而总结出用递归进行程序设计的规律和方法。
【指导说明】:⑴ 、分析每个图形的最基本图形。⑵ 、确定海龟起始的位置与方向。⑶ 、找出上下层 “递归” 插入
点。⑷ 、先编写出最底层的图形过程。⑸ 、执行过程确定图形正确无误。⑹ 、逐一插入 “递归” 步步为
营。
第二步:编写基本三角形 SJ 过程。
画出如图所示图形
⑴ 、在操作中学:画出左图所示图形。第一步:分析图形的基本结构。
基本图形
从三角形到树叉
TO SJ :B LT 90 FD :B/2 RT 120 FD :B BK :B RT 60 FD :B LT 120 FD :B BK :B LT 60 FD :B/2 RT 90END
TO SJ :B LT 90 FD :B/2 RT 120 FD :B BK :B RT 60 FD :B LT 120 FD :B BK :B LT 60 FD :B/2 RT 90END
? SJ 100 ↙
逐一添加“递归”与“调整”
LT 30 SJ :B/2 RT 30
RT 30 SJ :B/2 LT 30
LT 30 RT 30SJ :B/2
IF :B<10 STOP
30°
第三步:在上面的过程基础上,逐一插入“递归”命令行。
? SJ 100 ↙ ? SJ 100 ↙ ? SJ 100 ↙
⑵ 、在操作中学:再以“递归”插入点直接画出上图形。TO SJA :B IF :B<10 STOP PU LT 60 BK :B/4 LT 60 PD SJA :B/2 \ PU RT 60 FD :B/4 RT 60 PD FD :B RT 120 PU LT 60 BK :B/4 LT 60 PD SJA :B/2 \ PU RT 60 FD :B/4 RT 60 PD FD :B RT 120 PU LT 60 BK :B/4 LT 60 PD SJA :B/2 \ PU RT 60 FD :B/4 RT 60 PD FD :B RT 120END
TO SJB :B IF :B<10 STOP LT 90 FD :B/2 LT 30 SJB :B/2 RT 30 RT 120 FD :B LT 30 SJB :B/2 RT 30 RT 120 FD :B LT 30 SJB :B/2 RT 30 RT 120 FD :B/2 RT 90END
? DRAW RT 30 SJA 100 ↙ ? DRAW SJB 100 ↙
动脑筋,画一画
⑴ ⑵ ⑶ ⑷
⑸ ⑹ ⑺ ⑻
⑼ ⑽ ⑾ ⑿
三、多阶递归过程在一个递归过程体中进行了若干种不同级的递归调用。
1 、在操作中学:画出右图所示图形。TO D :B FD :B LT 45 RT 45 RT 45 LT 45 BK :BEND
TO DD :N :B :J IF :N<0 STOP FD :B LT 45 DD :N-2 :B*:J*:J :J RT 45 DD :N-1 :B*:J :J RT 45 DD :N-2 :B*:J*:J :J LT 45 BK :BEND
? FS DD 8 100 0.65↙
? D 100↙ 【说明】: :N 是级数参数, :B 是尺寸参数, :J 是相邻两级树的尺寸比例参数。
2 、在操作中学: :S由 0 变大时树会不同程度地往一边倾斜。TO DSB :L :N IF :N<1 FD :L STOP REPEAT 2[LT 90 FD :N/2 RT 90 \ FD :L RT 90 FD :N/2 RT 90] DSB :L :N-2END
TO DSC :B :A :S IF :B<5 STOP DSB :B :B/10 LT :A-:S DSC :B*0.6 :A :S RT :A DSC :B*0.8 :A :S RT :A DSC :B*0.6 :A :S LT :A+:S BK :BEND
? DSC 50 30 0↙
? DSC 50 30 5↙
? DSC 50 30 10↙
【说明】: :B 是树干尺寸参数, :A 是相邻两树叉夹角参数, :S 是风力大小参数。
? DSB 100 5↙
3 、在操作中学:画出右图所示图形。TO SJG :B :J IF :B<10 LT 90 YUAN 5 RT 90 STOP LT :J/2 FD :B SJG :B/2 :J BK :B RT :J FD :B/2 RT 90 FD :B/2 LT 90 YUAN 5 RT 90 BK :B/2 LT 90 FD :B/2 SJG :B/2 :J BK :B LT :J/2END
TO YUAN :R REPEAT 360[RT 0.5 FD :R*PI/180 RT 0.5]END
? SJG 100 60 ↙
4 、想一想:在下面过程中插入“递归”,画出的图形怎样?
TO J2 :B IF :B<10 STOP REPEAT 3[FD :B RT 120 J2 :B/2]END
TO Z1 :B IF :B<10 STOP REPEAT 4[FD :B Z1 :B/2 RT 90]END
TO Z2 :B IF :B<10 STOP REPEAT 4[FD :B RT 90 Z2 :B/2]END
TO J1 :B IF :B<10 STOP REPEAT 3[FD :B J1 :B/2 RT 120]END
动脑筋,画一画
⑴ ⑵ ⑶ ⑷
⑸ ⑹
动脑筋,画一画
⑾
⑺ ⑻ ⑼ ⑽
⑿
?HW11 0 30
?HW11 1 20
?HW11 2 10
?HW11 3 5
?HW12 50 1 1
?HW12 50 1 2
?HW12 50 1 3
?HW12 20 2 1
?HW12 20 3 1
?HW12 10 4 1
Recommended