[关闭]
@Arbalest-Laevatain 2018-10-05T13:40:42.000000Z 字数 2086 阅读 783

求斐波那契数列的编程实现

数据结构 经典算法与题目


递归法

二阶

  1. int fib(int a)
  2. {
  3. if (a == 0)
  4. return 0;
  5. else if (a == 1)
  6. return 1;
  7. else
  8. return fib(a - 1) + fib(a - 2);
  9. }

java

  1. //二阶斐波那契数列
  2. public static int fib(int a)
  3. {
  4. if ( a== 0)
  5. return 0;
  6. else if (a == 1)
  7. return 1;
  8. else
  9. return fib(a-1) + fib(a-2);
  10. }

python

  1. # 二阶斐波那契数列
  2. def fib (a):
  3. if a == 0:
  4. return 0
  5. elif a == 1:
  6. return 1
  7. else:
  8. return (fib(a-1) + fib(a-2))

k阶

java

  1. //k阶斐波那数列
  2. public static int fib_k(int a,int k)
  3. {
  4. int re = 0;
  5. if (a < k-1)
  6. return 0;
  7. else if (a == k-1)
  8. return 1;
  9. else
  10. {
  11. for (int i=1;i<=k;i++)
  12. re+=fib_k(a-i,k);
  13. return re;
  14. }
  15. }

python

  1. # k阶斐波那契数列
  2. def fib_k (a,k):
  3. re = 0
  4. if a < k-1:
  5. return 0
  6. elif a == k-1:
  7. return 1
  8. else:
  9. for i in range(1,k+1):
  10. re+=fib_k(a-i,k)
  11. #print(re)
  12. return re

数组法

二阶

先从简单的开始

  1. Status Fibonacci_0(int k, int m, int &f)
  2. {
  3. int x = 0;
  4. f = x;
  5. if (k < 2 || m < 0)
  6. return ERROR;
  7. if (m < k - 1)
  8. {
  9. f = 0;
  10. return OK;
  11. }
  12. if (m == k || m == k - 1)
  13. {
  14. f = 1;
  15. return OK;
  16. }
  17. else
  18. {
  19. int* l;
  20. l = (int*)malloc(k * sizeof(int));
  21. l[0] = 0;
  22. l[1] = 1;
  23. for (int i = k; i < m; i++)
  24. {
  25. int v = l[0] + l[1];
  26. l[0] = v;
  27. int tmp = l[0];
  28. l[0] = l[1];
  29. l[1] = tmp;
  30. f = l[0] + l[1];
  31. }
  32. }
  33. return OK;
  34. }

这里的函数参数k是阶数,须为2

k阶

  1. Status Fibonacci(int k, int m, int &f)
  2. /* 求k阶斐波那契序列的第m项的值f */
  3. {
  4. int i,j;
  5. if (k < 2 || m < 0)
  6. return ERROR;
  7. if (m < k - 1)
  8. {
  9. f = 0;
  10. return OK;
  11. }
  12. if (m == k || m == k - 1)
  13. {
  14. f = 1;
  15. return OK;
  16. }
  17. else
  18. {
  19. int* l;
  20. l = (int*)malloc(k * sizeof(int));
  21. for (i = 0; i < k - 1; i++)
  22. l[i] = 0;
  23. l[k - 1] = 1;
  24. for (i = k; i < m; i++)
  25. {
  26. for (j = k - 1; j > 0; j--)
  27. {
  28. int tmp = l[j];
  29. l[j] = l[j - 1];
  30. l[j - 1] = tmp;
  31. }
  32. int v = 0;
  33. for (j = 0; j < k; j++)
  34. v += l[j];
  35. l[k - 1] = v;
  36. f = 0;
  37. for (j = 0; j < k; j++)
  38. f += l[j];
  39. }
  40. }
  41. return OK;
  42. }

循环队列法

循环队列的定义

  1. #define ElemType int
  2. typedef struct {
  3. ElemType *base; // 存储空间的基址
  4. int front; // 队头位标
  5. int rear; // 队尾位标,指示队尾元素的下一位置
  6. int maxSize; // 最大长度
  7. } SqQueue;

c语言

  1. long Fib(int k, int n)
  2. /* 求k阶斐波那契序列的第n项fn
  3. 要求:必须使用循环队列
  4. */
  5. {
  6. long sum = 0;
  7. int i, j,m;
  8. SqQueue a;
  9. a.maxSize = k+1;
  10. //注意循环队列由于判空判满的问题所以有一个元素空间没有用
  11. a.base = (ElemType*)malloc(a.maxSize * sizeof(ElemType));
  12. a.front = 0;
  13. a.rear = 0;
  14. if (n < k - 1)
  15. {
  16. sum = 0;
  17. return sum;
  18. }
  19. else if (n == k-1)
  20. {
  21. sum = 1;
  22. return sum;
  23. }
  24. //初始化该队列对应的斐波那契数列
  25. do
  26. {
  27. a.base[a.rear] = 0;
  28. a.rear = (a.rear + 1) % a.maxSize;
  29. } while ((a.rear + 1) % a.maxSize != a.front);
  30. a.base[a.rear-1] = 1;
  31. m = a.front;
  32. for (i = k; i < n; i++)
  33. {
  34. long v = 0;
  35. j = a.front;
  36. do
  37. {
  38. v += a.base[j];
  39. j = (j + 1) % a.maxSize;
  40. } while ((j + 1) % a.maxSize != a.front);
  41. a.base[a.rear] = v;
  42. if ((a.rear + 1) % a.maxSize == a.front)
  43. {
  44. a.rear = a.front;
  45. }
  46. else
  47. a.rear = (a.rear + 1) % a.maxSize;
  48. a.front = (a.front + 1) % a.maxSize;
  49. }
  50. sum = 0;
  51. j = a.front;
  52. do
  53. {
  54. sum += a.base[j];
  55. j = (j + 1) % a.maxSize;
  56. } while ((j + 1) % a.maxSize != a.front);
  57. return sum;
  58. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注