180 likes | 334 Views
Logo 程序设计. ( 授课讲稿 ) 吴剑辉. 第五讲 复杂递归. 递归是一种思维、推理和解决问题的方法。递归解决的是规律性很强的问题,只要“略微简化的同类问题”可以解决。即,“自顶而下,步步求精”的方法。 递归调用语句出现在过程体的不同位置(尾部、头部或中间)分为尾部递归、首部递归和中部递归三种,后两者是较复杂。. 一、深入了解递归. 二、画二叉树学起. 三、多阶递归过程. 一、深入了解递归. 用尾部递归方式编写过程。. 用首部递归方式编写过程。. 1 、实例对照:设计倒计数和正计数过程。. TO DJS :N
E N D
Logo程序设计 (授课讲稿) 吴剑辉
第五讲 复杂递归 递归是一种思维、推理和解决问题的方法。递归解决的是规律性很强的问题,只要“略微简化的同类问题”可以解决。即,“自顶而下,步步求精”的方法。 递归调用语句出现在过程体的不同位置(尾部、头部或中间)分为尾部递归、首部递归和中部递归三种,后两者是较复杂。 一、深入了解递归 二、画二叉树学起 三、多阶递归过程
一、深入了解递归 用尾部递归方式编写过程。 用首部递归方式编写过程。 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 :N END ? DJS 5↙ ? ZJS 5 ↙ 5 4 3 2 1 1 2 3 4 5 想一想:求⑴、100+99+98+…+2+1 ⑵、
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 100 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 100 END 用中部递归方式编写过程: 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 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 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 :L END 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 :L END TO S1 :L IF :L<10 STOP FD :L LT 35 S1 :L/2 RT 70 S1 :L/2 LT 35 BK :L END ?S3 100↙ ?S1 100↙ ?S2 100↙
二、画二叉树学起 1、叉树问题 :以树杈交点(即节点)为界分层,每个节点都分出呈V形的树枝,这是一种复杂而有规律的基本图形。也是一种比较典型较复杂的递归问题。 ⑴、第一步:画树杈 (如右图)。 TO SHU :B :J LT :J/2 FD :B BK :B RT :J FD :B BK :B LT :J/2 END ?SHU 100 60↙ 【指导说明】: 画完树杈后,海龟要回到原来起始的位置和方向。
⑵、第二步:画二叉树。(编程步骤) TO SHU :B :J LT :J/2 FD :B BK :B RT :J FD :B BK :B LT :J/2 END IF :B<10 STOP “递归”插入点 ? SHU 80 60 4↙ SHU :B/2 :J SHU :B/2 :J ? 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 90 END 基本图形 画出如图所示图形
30° 第三步:在上面的过程基础上,逐一插入“递归”命令行。 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 90 END IF :B<10 STOP SJ :B/2 LT 30 RT 30 LT 30 SJ :B/2 RT 30 ?SJ 100 ↙ ?SJ 100 ↙ ?SJ 100 ↙ 逐一添加“递归”与“调整” RT 30 SJ :B/2 LT 30 ?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 120 END 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 90 END ?DRAW SJB 100 ↙ ?DRAW RT 30 SJA 100 ↙
动脑筋,画一画 ⑶ ⑷ ⑴ ⑵ ⑻ ⑺ ⑸ ⑹ ⑿ ⑽ ⑼ ⑾
三、多阶递归过程 在一个递归过程体中进行了若干种不同级的递归调用。 1、在操作中学:画出右图所示图形。 TO D :B FD :B LT 45 RT 45 RT 45 LT 45 BK :B END 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 :B END ?FS DD 8 100 0.65↙ 【说明】::N是级数参数,:B是尺寸参数,:J是相邻两级树的尺寸比例参数。 ?D 100↙
2、在操作中学::S由0变大时树会不同程度地往一边倾斜。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-2 END 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 :B END 【说明】::B是树干尺寸参数,:A是相邻两树叉夹角参数,:S是风力大小参数。 ? DSB 100 5↙ ? DSC 50 30 10↙ ? DSC 50 30 5↙ ? DSC 50 30 0↙
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/2 END TO YUAN :R REPEAT 360[RT 0.5 FD :R*PI/180 RT 0.5] END ?SJG 100 60 ↙
4、想一想:在下面过程中插入“递归”,画出的图形怎样?4、想一想:在下面过程中插入“递归”,画出的图形怎样? 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 TO J2 :B IF :B<10 STOP REPEAT 3[FD :B RT 120 J2 :B/2] END
动脑筋,画一画 ⑷ ⑵ ⑶ ⑴ ⑸ ⑹
动脑筋,画一画 ⑻ ⑼ ⑽ ⑺ ?HW12 50 1 1 ?HW12 50 1 2 ?HW12 50 1 3 ?HW11 1 20 ?HW11 0 30 ?HW12 20 2 1 ⑾ ?HW12 10 4 1 ?HW12 20 3 1 ⑿ ?HW11 2 10 ?HW11 3 5