zoukankan      html  css  js  c++  java
  • C和C指针小记(十一)-递归和迭代优化

    1、递归

    C通过运行时堆栈支持递归函数的实现.
    递归函数就是直接或间接调用自身的函数.
    一个小例子:

    /**
     使用递归将整型转换为ascii字符
    
     @param value 整型数
     */
    void binary2ascii(unsigned int value) {
        unsigned int quotient;
        quotient = value / 10;
        if (quotient != 0) {
            binary2ascii(quotient);
        }
        putchar(value % 10 + '0');
    }
    
    

    2、两个递归运用和用迭代优化的例子

    尾递归:递归调用出现在函数的尾部,并且之后不再执行任何任务
    尾递归可以方便的转换为迭代.由于递归是非常耗费内存的(每次函数调用都会在内存中分配空间),内存频繁的分配回收严重影响程序的执行效率.

    
    /**
     递归计算阶乘
    
     @param n 整数n
     @return 阶乘
     */
    long factorial(unsigned int n){
        if (n <= 0) {
            return 1;
        }else{
            return n * factorial(n - 1);
        }
    }
    
    
    /**
     迭代计算阶乘
    
     @param n 整数n
     @return 阶乘
     */
    long factorial_iteria(int n){
        int result = 1;
        while (n > 1) {
            result *= n;
            n -= 1;
        }
        return result;
    }
    
    
    
    /**
     递归计算斐波那契数
     效率非常低:计算fibonacci(10)时,fibonacci(3)重复计算了21次,计算fibonacci(30)时,fibonacci(3)计算了317811次
     @param n 整数n
     @return n的斐波那契数
     */
    long fibonacci(int n){
        if (n <= 2) {
            return 1;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
    
    
    /**
     迭代求斐波那契数列
     
     @param n 整数n
     @return n的斐波那契数
     */
    long fibonacci_iteral(int n){
        long result;
        long previous_result;
        long next_older_result;
        result = previous_result = 1;
        while (n > 2) {
            n -= 1;
            next_older_result = previous_result;
            previous_result = result;
            result = previous_result + next_older_result;
        }
        return result;
    }
    
    
    
  • 相关阅读:
    zoj-1610线段树刷题
    poj-3268最短路
    poj-2528线段树练习
    线段树-最小逆序数hdu1394
    线段树延迟更新
    hdu-4027线段树练习
    RMQ_第一弹_Sparse Table
    字符串hash与字典树
    背包问题
    网络流
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/10408125.html
Copyright © 2011-2022 走看看