zoukankan      html  css  js  c++  java
  • 递归、迭代和分治法

    一、递归算法:直接或间接地调用自身的算法。

    1、使用递归要注意的有两点:

    • 递归就是在过程或函数里面调用自身;
    • 在使用递归时,必须有一个明确的递归结束条件,称为递归出口.

    2、递归分为两个阶段:

    • 递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
    • 回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.

    利用递归可以解决很多问题:如背包问题,汉诺塔问题,...等.

    3、优缺点

    • 优点:结构清晰,可读性强,且容易用数学归纳法证明算法的正确性。
    • 缺点:(1) 递归算法需要调用递归栈存放函数的变量、计算结果等直至return后才会释放该栈,所以消耗内存空间;

          (2) 可能存在重复计算相同的子问题。

    二、分治法:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同,然后递归地解这些子问题,

          最后将各个子问题的解合并得到原问题的接。

    应用:二分搜索、大整数乘法。

    三、迭代:利用变量的原值推算出变量的一个新值。

    四、递归和迭代的区别:

    通过斐波那契数列为例:

          F(0)=1;  n = 0    

    F(n) =   F(1)=1;  n = 1

          F(n)=F(n-1)+F(n-2);  n > 1

    //递归实现
    int fib(int n){
         if(n>1) return fib(n-1) + fib(n-2);
         else return 1; // n = 0, 1时给出recursion终止条件
    }
    //迭代实现
    int fib(int n){
        int i, temp0, temp1, temp2;      
        if(n<=1) return 1;
        temp1 = 0;
        temp2 = 1;
        for(i = 2; i <= n; i++){
            temp0 = temp1 + temp2;
            temp2 = temp1;
            temp1 = temp0;
        }
        return temp0;
    }
    View Code
  • 相关阅读:
    LeetCode 485. Max Consecutive Ones
    LeetCode 367. Valid Perfect Square
    LeetCode 375. Guess Number Higher or Lower II
    LeetCode 374. Guess Number Higher or Lower
    LeetCode Word Pattern II
    LeetCode Arranging Coins
    LeetCode 422. Valid Word Square
    Session 共享
    java NIO
    非阻塞IO
  • 原文地址:https://www.cnblogs.com/jiaoqiang/p/8849707.html
Copyright © 2011-2022 走看看