妙解围棋子问题

有LOGO编程爱好者求问,【围棋问题】有一把围棋,三个三个数最后余下两个,五个五个数最后余下三个,七个七个数最后余下两个。问这把棋子最少有多少个?这个问题其实与围棋是风马牛不相及的问题。说是“围棋子”也可以,说是“豆子”、“小石子”甚至是若干支"铅笔"、或是“一队人马”、“士兵”都行。同质的命题,套上不同的“面具”就完全换了一个“风景画面”。其实其中的核心是“三个三个数最后余下两个,五个五个数最后余下三个,七个七个数最后余下两个”。教师讲课时如果只是给出了答案是“23个棋子”或是一个程序,那恐怕是没有达到“教书育人”的目的。这是一个发散性思维的问题,说少就有不下于十种思路不同的编程方式。作为老师而言,应剖析各种不同编程方式之间的区别及蕴藏的精妙思维;作为学生而言决不能一旦编写出一个可以得到正确答案的程序而沾沾自喜——深入的学习就必需尽可能多地想:“是不是还有别的解决途径”。“围棋子”这道题的多种编程方式都写在下面也是不必,略举几个例子,说明确有宽阔的思路就已经能够说明问题了。
解题一:
TO WQ1 ;For
FMSLogo
FOR[I 7 10000][
;预估围棋子数上限10000个
IF (AND
2=REMAINDER :I 3
;三个三个数最后余下两个
3=REMAINDER :I 5
;五个五个数最后余下三个
2=REMAINDER :I 7)[ ;七个七个数最后余下两个
PR :I STOP]
;输出符合条件的结果
]
END
解题二:
TO WQ2 :N
;:N是假设的起始数的初始值 For
FMSLogo
IF (AND 2=REMAINDER :N
3 ;三个三个数最后余下两个
3=REMAINDER :N 5
;五个五个数最后余下三个
2=REMAINDER :N 7)[ ;七个七个数最后余下两个
PR :N STOP]
;输出符合条件的结果
WQ2 :N+1
;棋子数自动增长1递归后再进行验证
END
解题三:
TO WQ3
:N
;:N是假设的起始数的初始值 For
FMSLogo
MAKE "A (:N-2)/3 = INT((:N-2)/3)
;排除除以3不余2
MAKE "B (:N-3)/5 = INT((:N-3)/5)
;排除除以5不余3
MAKE "C (:N-2)/7 = INT((:N-2)/7)
;排除除以3不余2
IF (AND :A="TRUE :B="TRUE :C="TRUE)[PR
:N STOP] ;输出最小的可能值
WQ3 :N+1
;棋子数自动增长1递归后再进行验证
END
有些学生反映上课听不懂,其原因可能有两个方面。其一,学生刚开始学习、知识积累尚少,所以无法理解;其二,老师的讲解应力求切中关键、深入浅出也是很重要的。
如果手头已经有林老师编著的LOGO编程教材,建议从头到尾仔细读一读。都不做基础学习的功课,一上来就刷题,当然就会觉得处处是障碍。
祝愿正在学习编程的孩子们都能够领略编程思维的精妙,学习到真本领。



LOGO语言编程是很好玩的。下面是LOGO编程输出的图形:
加载中,请稍候......