Logo程序设计之递归

已锁定

大本

  • 帖子

    228
  • 精华

    1
  • 被关注

    2

论坛等级:游士

注册时间:2008-02-21

普通 普通 如何晋级?

Logo程序设计之递归

2414

4

2008-02-21 19:55:34

一、如何正确认识递归
递归是一种思维、推理和解决问题的方法。递归解决的是规律性很强的问题,只要“略微简化的同类问题”可以解决。即,“自顶而下,步步求精”的方法。
在日常生活中也有类似递归的例子。人们常用“报数”的方法统计一队人的总人数。报数的规则是: 第一个人报1,后边的人只要在前边一个人报的数加 1 就可以了。假如你去问最后一个人,他报的数是否正确,我想他会说: “如果我前边的人报的都正确,我按规则加1,我报的数就正确。”
这种回答是科学的,因为他采用了递归的办法,把N个人的问题变成了前边N–1个人的问题,外加正确的报数规则。
用递归方法分析问题的要点
设计递归前的准备:
⑴、分层化简:分析每个图形的最基本图形。
⑵、准确方位:确定海龟起始的位置与方向。
⑶、选定标记:找出上下层 “递归” 插入点。
设计递归中的步骤:
⑴、设计模式:先编写出最底层的图形过程。
⑵、求解要素:执行过程确定图形正确无误。
⑶、逐步完善:逐一插入 “递归” 步步为营。
二、几种递归结构类型
为了更深入地研究递归过程,我们根据递归调用的位置、次数、直接和间接调用的情况,将递归过程分成几种结构类型,逐一讨论。
1、直接递归与间接递归过程
如果一个递归过程在过程体中直接调用自己,我们就称这种直接调用自身的递归调用为直接递归调用,相应的过程称为直接递归过程。
请看例题:TO A1 :N
IF :N<1 STOP
FD 50
REPEAT 3[FD 30 RT 120]
BK 20
RT 60
A1 :N-1
END
如果一个递归过程在过程体中并不直接调用自己过程,而是通过调用一个或几个其它过程,最后调用回自身过程,这种通过调用其它过程来实现了递归调用的方法,我们称为间接递归调用,相应的过程则为间接递归过程。
请看例题2:TO A2 :N
IF :N<1 STOP
B2 :N
END

TO B2 :N
FD 50
REPEAT 3[FD 30 RT 120]
BK 20 RT 60
A2 :N-1
END

另一类的过程为各自的过程体都构成递归形式,而则通过相互之间的调用方法来实现递归,我们也称之为间接递归调用,相应的过程称为间接递归过程。
再看例题3:
TO A3 :N :B
IF :N<1 STOP
ZFX :B LT 165 WAIT 50
B3 :N-1 :B+10
END

TO B3 :N :B
IF :N<1 STOP
SJX :B RT 165 WAIT 50
A3 :N-1 :B+10
END


2、尾部递归、首部递归与中部递归。
递归调用语句出现在过程体的不同位置(尾部、头部或中间)分为尾部递归、首部递归和中部递归三种,后两者是较复杂。
⑴、例题4:画逐层减半(或增半)的正方形(如图)。
尾部递归过程:
TO A4A :S
IF :S<10 STOP
REPEAT 4[FD :S RT 90]
PU FD :S PD
A4A :S/2
END
首部递归过程:
TO A4B :S
IF :S<10 STOP
A4B :S/2
REPEAT 4[FD :S RT 90]
PU FD :S PD
END
中部递归过程:
TO A4C_2 :S
IF :S<10 STOP
FD :S
A4C_2 :S/2
BK :S
REPEAT 4[FD :S RT 90]
END
TO A4D_2 :S
IF :S<10 STOP
REPEAT 4[FD :S RT 90]
FD :S
A4D_2 :S/2
BK :S
END
3、多次递归过程。
在一个过程体中可以若干次调用其他过程,同样,在一个过程中也允许多次的递归调用。如果在过程体中进行了多次的递归调用,这个过程称为多次的递归过程。
例题5:一条线段的变幻。
⑴、画线段
TO A5_1 :S
FD :S
BK :S
END
⑵、二次递归过程
TO A5_2 :S :J
IF :S<10 STOP
FD :S LT :J/2
A5_2 :S/2 :J
RT :J
A5_2 :S/2 :J
LT :J/2
BK :S
END
⑶ 、三次递归过程
TO A5_3 :S :J
IF :S<10 STOP
FD :S LT :J
A5_3 :S*0.6 :J
RT :J
A5_3 :S*0.6 :J
RT :J
A5_3 :S*0.6 :J
LT :J BK :S
END
(4)、四次递归过程
TO A5_4 :S :J
IF :S<10 STOP
FD :S LT :J/2
A5_4 :S*0.6 :J
RT :J/3
A5_4 :S*0.6 :J
RT :J/3
A5_4 :S*0.6 :J
RT :J/3
A5_4 :S*0.6 :J
LT :J/2 BK :S
END
4、多阶递归过程
在一个递归过程体中进行了若干种不同级的递归调用。
例题6:
TO A6 :N :B :J
IF :N<0 STOP
FD :B LT 45
A6 :N-2 :B*:J*:J :J
RT 45
A6 :N-1 :B*:J :J
RT 45
A6 :N-2 :B*:J*:J :J
LT 45 BK :B
END
【说明】::N是级数参数,:B是尺寸参数,:J是相邻两级树的尺寸比例参数。这过程是进行了三次的递归调用,其中进行了两种不同级的调用,一种为 A6 :N-2 :B*:J*:J :J
另一种为 A6 :N-1 :B*:J :J
三、画出更奇妙的图形
递归的功能很强,许多非常复杂的图形,实际上是用几行相当简单的过程画出来的。欣赏这些美妙的图形,更会激起我们探求知识奥秘的强烈欲望。
1、分割多边形
TO FGDBX :N :S
DRAW HT
FG :N :S
END

TO FG :N :S
IF :S<10 STOP
REPEAT :N[FD :S RT 180-(:N-2)*180/:N FG :N :S/2]
END
2、花团锦簇
TO HTJZ :N :S
IF :S<4 STOP
REPEAT:N[FD :S HTJZ :N :S/3 BK :S RT 45]
END

3、神奇的窗花
TO QHA :M
LT 90
FD :M*1.5 BK :M*3 FD :M*1.5 WAIT 100
PE FD :M/2 BK :M FD :M/2 PD WAIT 100
PU FD :M/2 RT 90 PD WAIT 100
REPEAT 3[FD :M RT 90] WAIT 100
PU FD :M/2 RT 90 PD WAIT 100
PU LT 90 FD :M/2 RT 90 FD :M/2 LT 90 PD WAIT 100
PU RT 90 BK :M/2 LT 90 BK :M/2 RT 90 PD WAIT 100
PU FD :M PD WAIT 100
PU BK :M PD WAIT 100
PU RT 90 FD :M/2 LT 90 FD :M/2 RT 90 PD WAIT 100
PU LT 90 BK :M/2 RT 90 BK :M/2 LT 90 PD WAIT 100
END
TO QHB :M :N
IF :N < 0 STOP
LT 90
FD :M*1.5 BK :M*3 FD :M*1.5
PE FD :M/2 BK :M FD :M/2 PD
PU FD :M/2 RT 90 PD
REPEAT 3[FD :M RT 90]
PU FD :M/2 RT 90 PD
PU LT 90 FD :M/2 RT 90 FD :M/2 LT 90 PD
QHB :M/3 :N-1
PU RT 90 BK :M/2 LT 90 BK :M/2 RT 90 PD
PU FD :M PD
QHB :M/3 :N-1
PU BK :M PD
PU RT 90 FD :M/2 LT 90 FD :M/2 RT 90 PD
QHB :M/3 :N-1
PU LT 90 BK :M/2 RT 90 BK :M/2 LT 90 PD
END

TO QHC :M :N
IF :N<0 STOP
LT 90
PU FD :M*1.5 PD BK :M*3 FD :M
PE FD :M RT 90 PD
FD :M/2
LT 90 QHC :M/3 :N-1 RT 90
FD :M/2 RT 90
FD :M/2
LT 90 QHC :M/3 :N-1 RT 90
FD :M/2 RT 90
FD :M/2
LT 90 QHC :M/3 :N-1 RT 90
FD :M/2 RT 90
PU FD :M/2 RT 90
END
TO QH1 :M :N
DRAW FS HT
REPEAT 4[PU FD :M+:M/2 PD QHB :M :N PU BK :M+:M/2 PD RT 90]
END

TO QH2 :M :N
DRAW FS HT
REPEAT 4[PU FD :M+:M/2 PD QHC :M :N PU BK :M+:M/2 PD RT 90]
END

4、奇妙的窗花
TO DZ1 :S
FD :S RT 45 FD :S LT 90 FD :S RT 45 FD :S
END
TO DZ2 :S
RT 90 FD :S LT 90 FD :S RT 90
LT 90 FD :S LT 90
RT 90 FD :S LT 90 FD :S RT 90
END
TO DZ3 :N :S
IF :N=0 DZ1 :S STOP
DZ3 :N-1 :S
RT 90 FD :S LT 90 FD :S RT 90
DZ3 :N-1 :S
LT 90 FD :S LT 90
DZ3 :N-1 :S
RT 90 FD :S LT 90 FD :S RT 90
DZ3 :N-1 :S
END
TO DZ :N :S
DRAW HT
REPEAT 2[DZ3 :N :S LT 90 FD :S LT 90]
END
5、万花筒
TO WHT :N
IF :N<1 STOP
MAKE "C RANDOM 14 SETPC :C
MAKE "M 2+RANDOM 30
MAKE "J 10+RANDOM 340
REPEAT :M [PXSBX 80 80 :J RT 360/:M]
WAIT 200 DRAW
WHT :N-1
END
TO PXSBX :B1 :B2 :J
REPEAT 2[FD :B1 RT :J FD :B2 RT 180-:J]
END
Logo程序设计之递归 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

LOGO!

共有2414条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。