【递归和循环】
题目:
大家都知道斐波那契数列,现在要求输入一个整数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。