zoukankan      html  css  js  c++  java
  • 算法——从斐波那契数列谈起(一)

    问题的开始

    现在有一个数列 (mathcal{f} _x)
    满足

    [mathcal{f} _x= egin{cases} 1 & x={0, 1} \ mathcal{f} _{x-1}+mathcal{f} _{x-2} & otherwise end{cases} ]

    通俗来讲,这个数列就是当前项等于之前两项之和。
    (mathcal{f}_xmod m的值)

    递归

    递归是函数自己调用自己的过程,是一种通过重复将问题分解为同类的子问题而解决问题的方法,和分治类似。

    递归的递归定义:

    递归就是一种通过递归来解决问题的方法。

    这时你如果要理解递归,就必须了解定义中加粗的递归的定义,于是你去看递归的定义,为了理解递归的定义,就必须了解定义中加粗的递归的定义(dots)

    于是你渐渐悟出,递归就是自己解释自己,自己使用自己的意思。

    事实上,递归在数学中也十分常见:

    集合论对自然数的正式定义是:
    (1) 是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。

    有限递归与无限递归

    无限递归的例子:

    从前有座山,山里有座庙。
    庙里有个老和尚在给小和尚讲故事。
    故事讲的是:
    从前有座山,山里有座庙。
    庙里有个老和尚在给小和尚讲故事。
    故事讲的是:
    (dots)

    没有终止,无穷无尽。

    有限递归的例子:

    你今年几岁?答:去年的岁数加一岁,2000 年我出生。

    这次是有穷尽的递归,到2000年停止递归(2000年时1岁)。
    这里2000年停止并返回1岁是递归的终止条件

    代码的例子

    int func(传入数值) {
      if (终止条件) return 最小子问题解;
      return func(缩小规模);
    }
    

    回到问题

    说了这么多,在回来看一看我们斐波那契数列的问题:

    这个数列就是当前项等于之前两项之和。

    现在这个问题很明显是递归了,求第 (x) 项时先调用 (x - 1)(x - 2) 项。

    代码

    int fabbic(int x) {
        if (x == 0 || x == 1) 
            return 1; // 终止条件
    
        return fabbic(x - 1) + fabbic(x - 2); // 递归调用
    }
    
  • 相关阅读:
    大富翁8分析
    DCOM实现分布式应用(三)
    DCOM实现分布式应用(一)
    [转]职业生涯中的10个致命错误
    VC中展开宏
    zoj 2853 Evolution
    poj 1088 滑雪
    hdu 2437 Jerboas
    poj 3070 Fibonacci
    zoj 2976 Light Bulbs
  • 原文地址:https://www.cnblogs.com/szdytom/p/13514726.html
Copyright © 2011-2022 走看看