递归函数先进后出问题

img


函数递归什么条件下是先进后出,看printff函数嘛?反向输出问题

递归就是先进后出的,与printf无关。
fun() 里面有调用它自身,一层一层调用,最里层先返回。
这个例子是用printf来输出一个数。放前面与放后面会有正向与反向的区别,是因为:
放前面,先输出,再递归调用,递归里面也是先输出再递归调用,所以是前向;
放后面,先递归调用,再输出,也就是,只要递归条件满足,会一直递归调用,直到最后一次递归条件不满足,开出输出,然后一次递归结束,回到上一次递归,也是输出,再返回,再输出,直到第一次递归调用返回,最后一次输出,所以是反向。

看输出是在调用递归函数之前还是之后即可,分别在之前之后调用输出结果不同

img

img

img

#include <stdio.h>
void print_num(int n)
{
    if(n == 0)  
    {
        return;
    }
    //先输出,输出987654321 
    printf("%d", n);  
    print_num(n - 1);  
      //后输出,输出123456789
    //printf("%d", n);  
}
int main()
{
    int n = 9;
    print_num(n);
    
    return 0;
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7737253
  • 除此之外, 这篇博客: 还不会用printf函数?我来教你中的 3.printf函数的转换说明修饰符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 修饰符列表含义
    数字表示最小字段宽度(默认为打印在字段右端),如若该字段宽度不能容纳待打印的项,那么系统会按照待打印项的宽度打印
    .数字对于浮点数来说表示小数点后应该保留几位小数(会四舍五入)(一些编译器默认打印为保留小数点后六位小数);对于整数来说表示打印的最小位数,如果待打印的整数不够最小位数会在前面补0至达到最小位数;对于字符串来说表示打印的字符个数
    l可以与%f,%d,%u等结合使用,如%lf(表示double类型的值),%ld(表示long int类型的值),%lu(表示unsigned long int类型的值)
    L可以与%f,%e等结合使用,如%Lf,%Le(表示long double类型的值)
    *号算一个占位符,可用于指定字段宽度和精确位数,且需要有对应的项与之匹配
    标记本文只介绍 (-,+,空格,#)(具体见后文)

    例代码如下:

    #include<stdio.h>
    int main()
    {
    	printf("/%s/\n", "hello world");
    	printf("/%.4s/\n", "hello world");
    	printf("/%10.4s/\n", "hello world");
    	printf("/%d/\n", 10);
    	printf("/%10d/\n", 10);
    	printf("/%.5d/\n", 10);
    	printf("/%10.5d/\n", 10);
    	printf("/%f/\n", 3.14);
    	printf("/%.2f/\n", 3.14);
    	printf("/%10f/\n", 3.14);
    	printf("/%10.2f/\n", 3.14);
    	printf("/%*.2f/\n", 10, 3.14);
    	printf("/%10.*f/\n", 2, 3.14);
    	printf("/%*.*f/\n", 10, 2, 3.14);
    	printf("/%*.*f/\n", 8, 4, 3.14);
    	return 0;
    }
    

    结果如下:
    在这里插入图片描述

    标记含义
    -号从字段的左侧开始打印该项
    +号待打印的值若为有符号值,且若为正值,则在值前补充加号,若值为负值,则在值前补充减号
    空格待打印的值若为有符号值,且若为正值,则在值前补充空格,若值为负值,则在值前补充减号
    #号如果作用于%o,则打印结果在值前显示0,如果作用于%x,则打印结果在值前显示0x

    例代码如下:

    #include<stdio.h>
    int main()
    {
    	printf("/%5d/\n", 10);
    	printf("/%-5d/\n", 10);
    	printf("/%+5d/\n", 10);
    	printf("/%+5d/\n", -10);
    	printf("/% 5d/\n", 10);
    	printf("/% 5d/\n", -10);
    	printf("%o\n", 10);
    	printf("%#o\n", 10);
    	printf("%x\n", 10);
    	printf("%#x\n", 10);
    	return 0;
    }
    

    结果如下:
    在这里插入图片描述
    注:标记也可灵活的组合运用,如“%+#7.2f”,本文不做过多演示,读者可自行尝试