Chinaunix首页 | 论坛 | 博客
  • 博客访问: 814504
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: C/C++

2013-09-18 14:36:17

斐波那契数列:1、1、2、3、5、8、13、21、…… 
  如果设F(n)为该数列的第n项(n∈N+)。那么这句话可以写成如下形式: 
  F(0) = 0,F(1)=1,F(n)=F(n-1)+F(n-2) (n≥2), 
  显然这是一个递推数列。 

这里就不推导了。我们只是分析碰到一些类似问题时要灵活的应用这个数列。

最早引入这种数列的是兔子问题,后续有还有奶牛的问题,只不过是间隔不一样,
兔子的间隔是2,奶牛的间隔是3(f(n) = f(n-1) + f(n-3));
斐波那契数列中的斐波那契数会经常出现在我们的眼前——比如松果、凤梨、树叶的排列、某些花朵的花瓣数、黄金矩形、黄金分割、等角螺线等,有时也可能是我们对斐波那契额数过于热衷,把原来只是巧合的东西强行划分为斐波那契数。比如钢琴上白键的8,黑键上的5都是斐波那契数
下面是自己写的关于奶牛的两种实现, 效率真不是一般的差距;


点击(此处)折叠或打开

  1. void
  2. time_cur_print(void)
  3. {
  4.     time_t cur_time;
  5.     struct tm *time_info;

  6.     time(&cur_time);
  7.     time_info = localtime(&cur_time);
  8.     printf("%s\n", asctime(time_info));
  9.     return;
  10. }

  11. unsigned long long
  12. recursion_cow(int n)
  13. {
  14.     if(n <= 0)
  15.         return ;

  16.     switch(n)
  17.     {
  18.         case 1: return 1; break;
  19.         case 2: return 1; break;
  20.         case 3: return 1; break;
  21.         default:
  22.                 return recursion_cow(n-1) + recursion_cow(n-3);

  23.     }
  24. }

  25. int
  26. no_recursion_cow(int n, unsigned long long *num)
  27. {
  28.     unsigned long long cow[3] = {1,1,1};
  29.     int index;
  30.     unsigned long long tmp3;

  31.     if(n <= 3)
  32.         return *num;

  33.     for(index = 4; index <= n; index++)
  34.     {
  35.         tmp3 = cow[0] + cow[2];
  36.         cow[0] = cow[1];
  37.         cow[1] = cow[2];
  38.         cow[2] = tmp3;
  39.     }


  40.     *num = tmp3;

  41.     return tmp3;
  42. }

  43. int
  44. main(void)
  45. {
  46.     int n;
  47.     unsigned long long num;

  48.     num = 1;

  49.     printf("pls enter the year and cow : \n");
  50.     scanf("%d", &n);

  51.     printf("after %d years:\n", n);



  52.     time_cur_print();
  53.     no_recursion_cow(n, &num);
  54.     time_cur_print();
  55.     printf("no_recursion_cow : %llu\n", num);

  56.     time_cur_print();
  57.     printf("recursion_cow : %llu\n", recursion_cow(n));
  58.     time_cur_print();

  59.     return 0;
  60. }

希望自己以后碰到可以触类旁通。                                                        
阅读(2331) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~