#include<stdio.h>
void binary_to_ascii(unsigned int value)
{
unsigned int quotient;quotient = value / 10;
if (quotient != 0)
{
binary_to_ascii(quotient);
}printf("%d ", value % 10 + '0');
printf("%d ", value % 10);
printf("\n");return;
}
int main(int argc, char *argv[])
{
binary_to_ascii(5201314);return;
}
#if 0
53 5
50 2
48 0
49 1
51 3
49 1
52 4#endif // 0
追踪递归函数:
假定我们以4267这个值调用递归函数,当函数刚开始的时候,堆栈的内容如下所示:
value = 4267 | quetinet |
其他函数调用所使用的变量 |
执行除法运算之后,堆栈的内容如下:
value = 4267 | quotient = 426 |
其他函数调用所使用的变量 |
接着 if 判断出 quotient 的值非零,所以对该函数执行递归调用,当这个函数第二次被调用之初,堆栈的内容如下:
value = 426 | quotient |
value = 4267 | quotient = 426 |
其他函数调用所使用的变量 |
堆栈上创建了一批新的变量,隐藏了前面的那批变量,除非当前这次递归调用返回,否则他们是不能被访问的。再次执行除法运算之后,堆栈的内容如下:
value = 426 | quotient = 42 |
value = 4267 | quotient = 426 |
其他函数调用所使用的变量 |
quotient的值现在是42,仍然非零,所以继续执行递归调用,并再创建一批新的变量。在执行完这次调用的除法之后,堆栈的内容如下:
value = 42 | quotient =4 |
value = 426 | quotient = 42 |
value = 4267 | quotient = 426 |
其他函数调用所使用的变量 |
此时,quotient的值还是非零,仍然需要执行递归调用,在执行除法运算之后,堆栈的内容如下:
value = 4 | quotient = 0 |
value = 42 | quotient = 4 |
value = 426 | quotient = 42 |
value = 4267 | quotient = 426 |
其他函数调用所使用的变量 |
不算递归调用语句本身,到目前为止所执行的语句只是除法运算和对quotient的进行测试。由于递归调用使这些语句重复执行,所以它的效果类似循环:当quotient的值非零时,把它的值作为初始值重新开始循环。但是,递归调用将会保存一些信息(这点与循环不同),也就是保存在堆栈中的变量值。这些信息很快就会变的非常重要。
现在quotient的值变成了零,递归函数不再调用自身,而是开始打印输出。然后函数返回,并开始销毁堆栈上的变量值。
函数出栈的顺序和入栈的顺序相反,所以依次输出:4 2 6 7。
然后这个递归函数就彻底返回到其他函数调用它的地点。
递归所具备的两个特性:
存在限制条件,当符合这个条件时递归便不再继续;
每次递归调用之后越来越接近这个限制条件