递归函数实现原理
函数定义:就是函数体的实现。函数体就是一个代码块,它在函数被调用时执行。
函数声明:向编译器提供该函数的相关的信息,包括:参数的数量,每个参数的类型以及返回值的类型。用于函数被正确的调用。
【注意】:当一个函数被调用时,编译器如果无法看到它的任何声明,那么它就假定函数返回一个整型值。对于那些返回值不是整型的函数,在调用之前对它们进行声明是非常重要的,这可以避免由于不可预测的类型转换而导致的错误。对于那些没有原型的函数,传递给函数的实参将进行缺省参数提升:char和short类型的实参被转换为int类型,float转换为double类型。
运行结果:25
2. 向编译器提供函数特定信息的方法有两种。第一种:将函数的定义放在源文件的前面。
第二种:提供函数原型。
3. 整型常量转换字符常量方法如下:
0 + ‘0’ = ‘0’
1 + ‘0’ = ‘1’
4. 递归本质的讲解:
例如:给出一个值4267, 我们需要依次产生字符‘4’, ‘2’, ‘6’, ‘7’.
分析递归的工作原理:
第一步:当函数刚开始执行时,堆栈的内容如下:
第二步:执行除法运算之后,堆栈的内容如下:
第三步:接着,if语句判断出p的值非零,所以对该函数执行递归调用。当这个函数第二次被调用之初,堆栈内容如下:
第四步:堆栈上创建了新的变量,隐藏了前面的那批变量,除非当前这次递归调用返回,否则它们是不能被访问的,再次执行除法运算之后,堆栈的内容如下:
第五步:m的值现在为42,仍然非零,所以继续执行递归调用,并再创建一批变量。在执行完这次调用的除法运算之后,堆栈的内容如下:
第六步:此时,m的值还是非零,继续执行递归调用。在执行除法运算之后,堆栈内容如下:
第七步:现在m的值为零,递归函数不再调用自身,而开始打印输出。然后函数返回,并开始销毁堆栈上的变量值。每次调用putchar得到的变量m的最后一个数字,并对m进行模10取余运算,将它与字符常量’0’相加,并输出结果。
输出结果:4
第八步:接着函数返回,它的变量从堆栈中销毁。接着,递归函数的前一次调用重新继续执行,它使用的是自己变量,它们位于堆栈的顶部。因为它的m值是42,所以调用putchar后打印出来的数字是2.
输出结果:42
输出结果:426
输出结果:4267
递归函数在栈内的执行过程: