zoukankan      html  css  js  c++  java
  • erlang的斐波那契数列

    【递归和循环】

    题目:

      大家都知道斐波那契数列,现在要求输入一个整数N,请输出斐波那契数列的第N项,以及前N项。 如:N <=39

    下面是斐波那契数列的实现:

    -module(feibo). 
    -export([feibo_list/1,ele/1]).
     
    %% 运行:feibo:feibo_list(5).
    %% 结果示例:【1,1,2,3,5】
     
    %% 函数element主要为了计算斐波那契数列的第N个元素
    ele(1) -> 1;
    ele(2) -> 1;
    ele(N) -> ele(N-1) + ele(N-2).
     
    %% 给定一个N,求出斐波那契的前N个数
    feibo_list(N) -> feibo_list([], N).
    feibo_list(L, 0) -> L;
    feibo_list(L, N) -> feibo_list([ele(N)|L], N-1).

    典型的数学归纳法,递归算法。

    下面是尾递归的实现。运行时间和效率远远高于上面递归算法。可以timer:tc/3自测

    -module(fib).
    
    -compile(export_all).
    
    %%尾递归 
    getfib(N,X,Y) when N<3 -> 
    Y; 
    getfib(N,X,Y) -> 
    getfib(N-1,Y,X+Y).

    尾递归相比递归的好处,一次压栈出栈,防止栈爆掉。

    问题引申和扩展:

        [跳台阶]
        [题目]
        一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
        [解析]
        与斐波那契数列的求解过程类似。典型的动态规划问题。对于第 n 级台阶,
        我们可以从第 n-1 级台阶一步到达,也可以从第 n-2 级台阶一步达到,
        则有递归式:f[n] = f[n-1] + f[n-2],
        初始状态 f[1] = 1, f[2] = 2。
  • 相关阅读:
    Canvas文本绘制
    Canvas贝塞尔三级曲线
    Canvas贝塞尔二级曲线
    Canvas arcTo绘制圆弧
    mybatis springmvc调用oracle存储过程,返回记录集
    java调用oracle存储过程,返回结果集
    oracle存储过程返回结果集
    存储过程变量类型定义与表字段一致
    HTML5获取当前的经纬度坐标
    实现精灵沿着圆形轨迹运动
  • 原文地址:https://www.cnblogs.com/unqiang/p/9377780.html
Copyright © 2011-2022 走看看