一: 什么是递归。
程序调用自身的编程技巧称为递归
通常把一个大型问题层层转化成一个与原问题相似的规模较小的问题来求解。
比如最简单的一个递归:
我们在main函数中调用main函数,那么他会先打印一个hehe,然后重新进入main函数中去,继续打印hehe,直到栈溢出,程序停止。
二: 递归的两个必要条件。
①:存在限制条件,当满足这个限制条件的时候,递归便不在继续。
②:每次递归调用后越来越接近这个限制条件。
我们就以上面的mian函数为例:
这里我们定义了一个变量input,当使用一次main函数时,input--,当input为0时,递归不再继续下去,递归开始返回,然后程序结束。其中main函数使用了三次,所以打印了三个hehe。
三: 递归的简单应用。
①: 输入一个无符号整型,按照顺序将他的每一位打印在屏幕上,中间留个空格。
例:输入 1234
输出 1 2 3 4
我们可以这样来理解,要得到1234中的每一位,其中最容易得到就是4,1234%10就得到
了4。 然后1234 / 10 % 10 就得到了3。依次类推,我们可以把4,3,2,1都得出了。
接下来用代码来实现。
接下来用画图来一步步了解是怎么运行的。
红色的表示递归进去,黄色表示递归出来。可以看出,当a >= 10的时候,继续递归,一直到a小于10,此时的a = 1,我们跳过递归,直接打印1 % 10,然后这一层结束,返回上一层。这层我们的print函数已经结束,所以跳到打印部分,此时的a是12,打印 12 % 10,就得出了2。依次网上结束递归,打印3 4,然后返回主函数,程序结束。我们来看看结果是不是这样。
②: 写一个函数实现strlen。(不准使用临时变量)
首先我们看一下要怎么用函数实现。
创建一个char 类型的数组arr,初始化为“abcdef”,此时数组里面就包含了a b c d e f \0;
strlen求字符个数,不包括\0,就是说到\0停止。判断数组的首元素是不是\0,不是创建变量count加一,然后地址往后取一位(char类型往后取一位就是首地址+1,int类型就是+4),接着判断直到遇到\0,返回0,最后输出count。
这里我们就写出了一个使用变量count的函数,条件是不准用,我们用递归来实现。
下面是代码:
我们接着画图来看一下内部是怎么实现的。
红色表示进去,黄色表示出来返回的值。(咳咳,最近在练字了。)
关于初识递归就到这了。等我把汉诺塔研究完了再来一篇。