zoukankan      html  css  js  c++  java
  • 递归

    一.递归的基本思想
    1.递归:某个函数直接或间接的调用自身
    2.问题的求解过程:划分成许多相同性质子问题的求解,而小问题的求解过程可以很容易的求出,
    这些子问题的解就构成里原问题的解。


    二.总体思想
    1.待求解问题的解:输入变量x的函数f(x)
    2.通过寻找函数g( ), 使得f(x) = g(f(x-1))
    3.已知f(0)的值, 就可以通过f(0)和g( )求出f(x)的值

    三.区别
    1.枚举:把一个问题划分成一组子问题, 依次对这些子问题求解子问题之间是横向的, 同类的关系。子问题的解就是原问题的解
    2.递归:把一个问题逐级分解成子问题子问题与原问题之间是纵向的, 同类的关系语法形式上: 在一个函数的运行过程中, 调用这个函数自己
    直接调用: 在fun()中直接执行fun()
    间接调用: 在fun1()中执行fun2(); 在fun2()中又执行fun1()
    递归与枚举的区别
    4
    递归的三个要点
    递归式:
    如何将原问题划分成子问题
    递归出口:
    递归终止的条件, 即最小子问题的求解,可以允许多个出口
    界函数:
    问题规模变化的函数, 它保证递归的规模向出口条件靠拢
    5
    给定n, 求阶乘n!
    int Factorial(int n){
    if (n == 0)
    return 1;
    else
    return n * Factorial(n - 1);
    }
    int n, m=1;
    for (int i=2; i<=n; i++)
    m *= i;
    printf(“%d的阶乘是%dn”,
    n, m);
    求阶乘的递归程序
    6
    主程序
    参数4 4*Factorial(3)
    参数3 3*Factorial(2)
    参数2 2*Factorial(1)
    参数1 1*Factorial(0)
    参数0 Factorial(0) 1
    1 2 6
    24
    阶乘的栈
    7
    递归解决问题的关键
    1) 找出递推公式
    2) 找到递归终止条件
    注意事项:

    webkit-auto; text-indent: 0px; text-tr由于函数的局部变量是存在栈上的
    如果有体积大的局部变量, 比如数组,
    而递归层次可能很深的情况下, 也许会导致栈溢出
    可以考虑使用全局数组或动态分配数组

  • 相关阅读:
    bfs入门 (HDU
    Codeforces Round #570 (Div. 3)B
    nyoj 277-车牌号 (map, pair, iterator)
    nyoj 276-比较字母大小 (顺序比较, 逆序输出)
    nyoj 275-队花的烦恼一 (stack, push, pop)
    nyoj 274-正三角形的外接圆面积 (R = PI * a * a / 3)
    nyoj 273-字母小游戏 (getline(cin, string))
    nyoj 268-荷兰国旗问题 (count)
    nyoj 266-字符串逆序输出 (isdigit(), geline(cin, my_string))
    nyoj 264-国王的魔镜 (string[-1:-int(str_len/2+1):-1])
  • 原文地址:https://www.cnblogs.com/wanderingzj/p/5258503.html
Copyright © 2011-2022 走看看