学习C语言的时候,曾经写过一篇关于C语言递归的的一篇博文。这几天想尝试一下利用scratch解析数学表达式,考虑用递归的方式,但是不清楚scratch是否支持递归这种方式,所以做了如下测试。结局还是挺喜人的。附上C语言的递归笔记,如果有兴趣的亲们,也可以参考一下。
上面这个程序能够实现将10进制的数字转换为8进制的数字,比如将100转换为8进制的“144”。程序本身没有多少块积木,可以说一目了然,但是值得注意的一点是,在自制积木“递归”定义过程中,我们直接调用了这块积木本身,我们已经接触了循环的嵌套,这种方式,看着是不是有点儿像自制积木的嵌套?顺便一提,自制积木在其他的编程语言中,我们一般称其为“函数”,它的英文名字就叫“function”。
自制积木这么一嵌套后发生了什么事呢,因为一块自制积木等同一大段自定义的积木组合,嵌套之后,打乱了程序的执行顺序,所以程序实际的执行顺序就变成了上图这样。
当传入自制积木的num值变成0的时候,程序什么也不会做。所以当我们给了递归函数一个参数“100”之后,程序的实际运行步骤类似上图。是不是感觉像一块压缩饼干,泡了水之后膨胀成了原来的好多倍?那么递归有什么用呢,比如在这个题目下,如果要计算将100转换为8进制,正常的顺序是用100先除以8,求得余数是4,继续用商12除以8,又求得余数4,最后用1除以8,求得余数1,做完这些,我们还需要将上述3个余数做一个逆序的排列。光听起来,操作步骤就很繁杂了吧?更麻烦的事情在于,我们无法确定最终的得数究竟是几位数字。显然,在某些问题上,递归可以大量简化我们的编程工作,当然,有得必然有失,编写一个靠谱的递归程序,可能也会消耗亲更多的脑细胞:)。