zoukankan      html  css  js  c++  java
  • 编程之美2.9 斐波那契数列

          斐波那契数列是我们在学习C语言的时候。在递归那一章的经典实例。当然,还会有汉诺塔的样例。

          这个问题时这样定义的:

                      0 (x <= 0)

           f(x)   =  1 (x == 1)

                       f(x - 1) + f(x - 2) (x > 1)

          看到这个递推公式后。我们非常easy能够写出例如以下的代码:

          函数声明:

    typedef long long ll;

    ll DutFibonacci_1(int);

          函数定义:

    /*经典的斐波那契数列的递归解法,并且每一个人都知道这样的方法效率非常低*/
    ll DutFibonacci_1(int n)
    {
    	if (n <= 0)
    		return 0;
    	else if (n == 1)
    		return 1;
    	else
    		return DutFibonacci_1(n - 1) + DutFibonacci_1(n - 2);
    }

          只是,当你输入一个比較大的 x 值后,你会发现,你等了非常久,还是没有不论什么输出,这就是递归效率低的问题。递归是利用栈的思想,一次次的入栈算它的前一个值,然后在一次次的出栈算它的后一个值,最后,得到终于的值(最后一个值)。

    那么,我们能够知道,事实上这里须要保存函数的地址。各个參数的值等等一系列的操作,肯定是浪费了大量的时间和资源,所以。我们须要寻求第二种方法解决问题。

          大多数递归的问题都是能够利用循环去解决的,所以,我们能够尝试的写出例如以下的循环求解代码:

          函数声明:

    ll DutFibonacci_2(int);

          函数定义:

    ll DutFibonacci_2(int n)
    {
    	if (n <= 0)
    		return 0;
    	else if (n == 1)
    		return 1;
    
    	ll one = 1;
    	ll two = 0;
    	ll result = 0;
    
    	/*非递归解法也非常简单。利用两个中间数,计算“以前”出现的值就能够了*/
    	for (int i = 2; i <= n; ++i)
    	{
    		result = one + two;
    
    		two = one;
    		one = result;
    	}
    
    	return result;
    }



  • 相关阅读:
    循环图片 yi
    给大家一个经典的.net情感故事 yi
    [东邪西毒][程序员版][原版][剧情] yi
    Sqlite 使用笔记 中文显示为乱码 yi
    sql2005安装过程,(不装C盘) yi
    Visual Studio 2010 美女与程序员的爱情网剧全集 yi
    IT行业几大职业病 yi
    标准化操作
    【ActiveMQ Tuning】Serializing to Disk
    我的山寨敏捷四季之春
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7290746.html
Copyright © 2011-2022 走看看