zoukankan      html  css  js  c++  java
  • 学点 C 语言(35): 函数 递归


    1. 递归就是: 函数自己调用自己

    这是一个最简单的递归, 不过它会一直执行, 可用 Ctrl+C 终止.
    #include <stdio.h>
    
    void prn(void) {
        printf("C++Builder 2009\n");
        prn();  /* 自调用; 注意它会一直执行, 可用 Ctrl+C 终止执行 */
    }
    
    int main(void)
    {
        prn();
        getchar();
        return 0;
    }
    

    2. 使用递归一定要有跳出的条件:
    #include <stdio.h>
    
    void prn(int num) {
        printf("%d\n", num);
        if (num > 0) prn(--num);  
    }
    
    int main(void)
    {
        prn(9);
        getchar();
        return 0;
    }
    

    3. 实例: 翻转字符串
    #include <stdio.h>
    
    void revers(char *cs);
    
    int main(void)
    {
        revers("123456789");
    
        getchar();    
        return 0;
    }
    
    void revers(char *cs)
    {
        if (*cs)
        { 
            revers(cs + 1);
            putchar(*cs);
        }
    }
    

    4. 实例: 阶乘
    #include <stdio.h>
    
    int factorial(int num);
    
    int main(void)
    {
        int i;
        for (i = 1; i <= 9; i++)
        printf("%d: %d\n", i, factorial(i));
    
        getchar();    
        return 0;
    }
    
    int factorial(int num)
    {
        if (num == 1)
            return(1);
        else
            return(num * factorial(num-1));
    }
    

    5. 实例: 整数到二进制
    #include <stdio.h>
    
    void IntToBinary(unsigned num);
    
    int main(void)
    {
        IntToBinary(255); /* 11111111 */
        getchar();
        return 0;
    }
    
    void IntToBinary(unsigned num) {
        int i = num % 2;
        if (num > 1) IntToBinary(num / 2);
        putchar(i ? '1' : '0'); 
    //    putchar('0' + i);  /* 可代替上面一句 */
    }
    

    6. 剖析递归:
    #include <stdio.h>
    
    void prn(unsigned n);
    
    int main(void)
    {
        prn(1);
        getchar();
        return 0;
    }
    
    void prn(unsigned n) {
        printf("%d: %p\n", n, &n);  /* A */
        if (n < 4) 
            prn(n+1);               /* B */
        printf("%d: %p\n", n, &n);  /* C */
    }
    

    本例输出效果图:



    分析:
    程序运行到 A, 输出了第一行.
    此时 n=1, 满足 < 4 的条件, 继续执行 B 开始了自调用(接着会输出第二行); 注意 n=1 时语句 C 还有待执行.
    ...如此循环, 一直到 n=4, A 可以执行, 但因不满足条件 B 执行不了了; 终于在 n=4 时得以执行 C.
    但此时内存中有四个函数都等待返回(分别是 n=1、2、3、4 时), 咱们分别叫它 f1、f2、f3、f4.
    f4 执行 C 输出了第五行, 函数返回, 返回给 f3(此时 n=3), f3 得以继续执行 C, 输出了第六行.
    f3 -> f2 -> 继续 C, 输出了第七行.
    f2 -> f1 -> 继续 C, 输出了第八行, 执行完毕!

    如此看来, 递归函数还是很费内存的(有时不如直接使用循环), 但的确很巧妙.

  • 相关阅读:
    Clever Y POJ
    Searching the String ZOJ
    DNA repair HDU
    考研路茫茫——单词情结 HDU
    DNA Sequence POJ
    病毒侵袭持续中 HDU
    C语言结构体和联合体
    c语言趣味
    c语言指针
    c语言指针难点
  • 原文地址:https://www.cnblogs.com/del/p/1347547.html
Copyright © 2011-2022 走看看