C语言--递归

#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 = 4267quetinet
其他函数调用所使用的变量 

执行除法运算之后,堆栈的内容如下:

value = 4267quotient = 426
其他函数调用所使用的变量 

 接着 if 判断出 quotient 的值非零,所以对该函数执行递归调用,当这个函数第二次被调用之初,堆栈的内容如下:

value = 426quotient
value = 4267quotient = 426
其他函数调用所使用的变量 

堆栈上创建了一批新的变量,隐藏了前面的那批变量,除非当前这次递归调用返回,否则他们是不能被访问的。再次执行除法运算之后,堆栈的内容如下:

value = 426quotient = 42
value = 4267quotient = 426
其他函数调用所使用的变量 

quotient的值现在是42,仍然非零,所以继续执行递归调用,并再创建一批新的变量。在执行完这次调用的除法之后,堆栈的内容如下:

value = 42quotient =4
value = 426quotient = 42
value = 4267quotient = 426
其他函数调用所使用的变量 

此时,quotient的值还是非零,仍然需要执行递归调用,在执行除法运算之后,堆栈的内容如下:

value = 4quotient = 0
value = 42quotient = 4
value = 426quotient = 42
value = 4267quotient = 426
其他函数调用所使用的变量 

不算递归调用语句本身,到目前为止所执行的语句只是除法运算和对quotient的进行测试。由于递归调用使这些语句重复执行,所以它的效果类似循环:当quotient的值非零时,把它的值作为初始值重新开始循环。但是,递归调用将会保存一些信息(这点与循环不同),也就是保存在堆栈中的变量值。这些信息很快就会变的非常重要。

现在quotient的值变成了零,递归函数不再调用自身,而是开始打印输出。然后函数返回,并开始销毁堆栈上的变量值。

函数出栈的顺序和入栈的顺序相反,所以依次输出:4  2  6  7。

然后这个递归函数就彻底返回到其他函数调用它的地点。

递归所具备的两个特性:

存在限制条件,当符合这个条件时递归便不再继续; 

每次递归调用之后越来越接近这个限制条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值