先占坑 后面再写详细的 import numpy as np def pow(n): a = np.array([[1,0],[0,1]]) b = np.array([[1,1],[1,0]]) n -= 1 while(n > 0): if (n % 2 == 1): a = np.dot(b, a) b = np.dot(b, b) n >>= 1 return a[0][0] n = int(input()) print(factorial(n))
背景 众所周知,Haskell语言是一门函数式编程语言.函数式编程语言的一大特点就是数值和对象都是不可变的,而这与经常需要对状态目前的值进行修改的动态规划算法似乎有些"格格不入",本文对几乎可以说是动态规划的最简单特例:斐波那契数列的求解提出几种算法(不包括矩阵快速幂优化.Monad和通项公式计算),探讨一下函数式编程如何结合动态规划. 自底向上写法 算法1: f' 1 _ b = b f' n a b = f' (n - 1) b (a + b) f n = f' n 0 1 尾递归
递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调用的层级太多,就会超出栈容量. 循环:通过设置计算的初始值及终止条件,在一个范围内重复运算. 斐波拉契数列 题目一:写一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项,定义如下: 第一种解法:用递归的算法: long long Fabonacci(unsigned int n) { i
F1: 迭代法 最慢,复杂度最高 F2: 直接法 F3: 矩阵法 参考<算法之道(The Way of Algorithm)>第38页-魔鬼序列:斐波那契序列 F4: 通项公式法 由于公式中包含根号5,无法取得精确的结果,数字越大误差越大 using System; using System.Diagnostics; namespace Fibonacci { class Program { static void Main(string[] args) { ulong result; ; C
一.斐波那契数列求第n项两种方式 1.递归(自上而下)def recur_fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return recur_fibonacci(n - 1) + recur_fibonacci(n - 2) 2.循环(自下而上) def loop_fibonacci(n): a = 0 b = 1 l = [0] # 这里的l是把生成的斐波那契数列返回了 for i in range(n): a, b = b,