国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法】斐波那契數(shù)列與臺風(fēng)的故事

這篇具有很好參考價(jià)值的文章主要介紹了【算法】斐波那契數(shù)列與臺風(fēng)的故事。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在小島的一個(gè)海濱小鎮(zhèn)上,住著一個(gè)名叫蘇菲的女孩。蘇菲一家人靠海為生,她的生活簡單而樸素,與大自然和諧共生。每天,蘇菲都會(huì)來到海邊,欣賞那美麗的日出和日落,感受著大海的呼吸。

然而,小島的美麗風(fēng)光并非一成不變。每年夏季,熱帶氣旋活躍,臺風(fēng)頻繁登陸,給小島帶來了嚴(yán)重的危害。

有一天,蘇菲經(jīng)歷了一場猛烈的臺風(fēng)。臺風(fēng)帶來的狂風(fēng)暴雨席卷了整個(gè)小鎮(zhèn),樹木被連根拔起,房屋倒塌,街道一片狼藉。蘇菲的家也被摧毀了,她無家可歸,生活陷入了困境。

在臺風(fēng)的影響下,蘇菲失去了親人,她感到孤獨(dú)和無助。然而,她并沒有放棄,她決定勇敢面對生活的挑戰(zhàn)。

在臺風(fēng)過后,蘇菲積極參與災(zāi)后重建工作,幫助鄰居們重建家園。她用自己的雙手清理廢墟、種植樹木,為小鎮(zhèn)重新帶來了生機(jī)。

在成長過程中,她遇到了一個(gè)氣象專家,教會(huì)她一些數(shù)學(xué)知識。她決定要用自己的知識和力量去保護(hù)家園,減少自然災(zāi)害帶來的損失。

她對斐波那契數(shù)列有著濃厚的興趣,在閑暇時(shí)會(huì)用海灘上的貝殼擺出斐波那契數(shù)列的形狀。

有一天,蘇菲注意到一個(gè)有趣的現(xiàn)象:臺風(fēng)的路徑似乎與斐波那契數(shù)列有關(guān)。她開始研究臺風(fēng)的形成和運(yùn)動(dòng)原理,發(fā)現(xiàn)臺風(fēng)的生命周期與斐波那契數(shù)列的規(guī)律有著奇妙的聯(lián)系。

為了更準(zhǔn)確地預(yù)測臺風(fēng),蘇菲需要處理大量的數(shù)據(jù),進(jìn)行復(fù)雜的計(jì)算。然而,她意識到傳統(tǒng)的計(jì)算方法效率低下,無法滿足實(shí)時(shí)預(yù)測的需求。于是,她開始尋找更高效的計(jì)算方法。

在一次數(shù)學(xué)課程中,蘇菲學(xué)到了矩陣乘法的知識,她突然想到可以利用矩陣乘法來降低計(jì)算復(fù)雜度。她將臺風(fēng)的數(shù)據(jù)整理成矩陣形式,并利用矩陣乘法的快速冪算法來計(jì)算臺風(fēng)的運(yùn)動(dòng)軌跡和強(qiáng)度變化。

通過實(shí)踐,蘇菲發(fā)現(xiàn)利用矩陣乘法快速冪算法可以將計(jì)算復(fù)雜度降低到原來的十分之一以下,大大提高了計(jì)算效率。她將這種方法應(yīng)用于臺風(fēng)預(yù)測模型中,取得了顯著的成果。

蘇菲將她的發(fā)現(xiàn)告訴了她的老師,得到了贊賞和支持。氣象學(xué)家們將蘇菲的方法應(yīng)用于更廣泛的天氣預(yù)測中,取得了良好的效果。利用這一發(fā)現(xiàn),政府可以提前做好防災(zāi)減災(zāi)的準(zhǔn)備,減少臺風(fēng)帶來的損失。

斐波那契數(shù)列的遞推公式為:F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(xiàn)(2) = 1。
以10為例,斐波那契數(shù)列的前10項(xiàng)為:
2 3 5 8 13 21 34 55

蘇菲面臨一個(gè)問題,當(dāng)n=2000000的時(shí)候,就算用超級計(jì)算機(jī)來計(jì)算也會(huì)超時(shí),等運(yùn)算完畢,臺風(fēng)已經(jīng)消失了,怎么處理這個(gè)問題呢?


算法實(shí)現(xiàn):

 1 public static BigInteger fib(int n)
 2 {
 3     Console.WriteLine(n);  // 打印輸入的參數(shù)n,用于調(diào)試
 4 
 5     BigInteger semn = 1;  // 定義一個(gè)BigInteger類型的變量semn,用于存儲(chǔ)符號
 6     BigInteger t = 0;  // 定義BigInteger類型的變量t,用于臨時(shí)存儲(chǔ)中間計(jì)算結(jié)果
 7     BigInteger i = 1;  // 定義BigInteger類型的變量i,初始化為1
 8     BigInteger j = 0;  // 定義BigInteger類型的變量j,初始化為0
 9     BigInteger k = 0;  // 定義BigInteger類型的變量k,初始化為0
10     BigInteger h = 1;  // 定義BigInteger類型的變量h,初始化為1
11 
12     if (n < 0)  // 如果n小于0,表示需要計(jì)算負(fù)數(shù)的斐波那契數(shù)
13     {
14         n *= -1;  // 將n取絕對值
15         semn = n % 2 == 0 ? -1 : 1;  // 判斷n的絕對值是否為偶數(shù),如果是偶數(shù),semn為-1,否則為1
16     }
17 
18     while (n > 0)  // 當(dāng)n大于0時(shí),進(jìn)行循環(huán)計(jì)算斐波那契數(shù)
19     {
20         if (n % 2 != 0)  // 如果n是奇數(shù)
21         {
22             t = j * h;  // 計(jì)算j乘以h的結(jié)果,并賦值給t
23             j = i * h + j * k + t;  // 更新j的值,根據(jù)斐波那契數(shù)列的遞推公式計(jì)算
24             i = i * k + t;  // 更新i的值,根據(jù)斐波那契數(shù)列的遞推公式計(jì)算
25         }
26         t = h * h;  // 計(jì)算h的平方,并賦值給t
27         h = 2 * k * h + t;  // 更新h的值,根據(jù)斐波那契數(shù)列的遞推公式計(jì)算
28         k = k * k + t;  // 更新k的值,根據(jù)斐波那契數(shù)列的遞推公式計(jì)算
29         n = n / 2;  // 將n除以2,用于控制循環(huán)次數(shù)
30     }
31 
32     return j * semn;  // 返回計(jì)算得到的斐波那契數(shù)乘以符號semn,得到最終結(jié)果
33 }

這段代碼使用了數(shù)論中的快速冪算法來計(jì)算斐波那契數(shù),通過減少循環(huán)次數(shù)來降低計(jì)算量。讓我們以n=2000000為例來解釋算法的步驟。

首先,我們初始化變量i、j、h和k的值為0、1、1和0。然后,我們進(jìn)入循環(huán),當(dāng)n大于0時(shí),進(jìn)行迭代計(jì)算。

在第一次迭代中,由于n=2000000是一個(gè)偶數(shù),我們只需要更新h和k的值。我們計(jì)算h的平方并將結(jié)果存儲(chǔ)在t中,然后更新h的值為2*k*h + t,更新k的值為k*k + t。此時(shí),n被除以2,變?yōu)?000000。

在第二次迭代中,由于n仍然是一個(gè)偶數(shù),我們再次只需要更新h和k的值。我們計(jì)算h的平方并將結(jié)果存儲(chǔ)在t中,然后更新h的值為2*k*h + t,更新k的值為k*k + t。此時(shí),n被除以2,變?yōu)?00000。

依此類推,我們繼續(xù)進(jìn)行迭代,每次將n除以2,直到n變?yōu)?。在這個(gè)過程中,我們只需要更新h和k的值,而不需要更新i和j的值。

當(dāng)n變?yōu)?時(shí),我們進(jìn)行最后一次迭代。由于n是奇數(shù),我們需要更新i和j的值。我們計(jì)算j*h的結(jié)果并將其存儲(chǔ)在t中,然后更新j的值為i*h + j*k + t,更新i的值為i*k + t。

最后,當(dāng)n變?yōu)?時(shí),循環(huán)終止。此時(shí),i的值就是斐波那契數(shù)列中第2000000個(gè)數(shù)的值。

通過使用快速冪算法,我們只需要進(jìn)行l(wèi)og(n)次循環(huán),而不是n次循環(huán),從而大大降低了計(jì)算量。在這個(gè)例子中,由于n=2000000,我們只需要進(jìn)行l(wèi)og(2000000) ≈ 21次循環(huán),而不是2000000次循環(huán),從而提高了計(jì)算效率。


?

測試用例:

 1 using NUnit.Framework;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Numerics;
 5 
 6 public class FibonacciTest
 7 {
 8 
 9     [Test]
10     public void testFib()
11     {
12         List<int> tests = new List<int> { 0, 1, 2, 3, 4, 5, -6, -96, 1000, 1001 };
13 
14         Random rnd = new Random();
15         for (int i = 0; i < 10; ++i)
16         {
17             tests.Add(rnd.Next(-100, 0));
18         }
19         tests.Add(rnd.Next(10000, 100000));
20         tests.Add(rnd.Next(1000000, 1500000));
21 
22         foreach (int n in tests)
23         {
24             BigInteger found = Fibonacci.fib(n);
25             Assert.AreEqual(FibonacciRef.fib(n), found);
26         }
27     }
28     
29     private static class FibonacciRef
30     {
31         private static IDictionary<int, BigInteger> fibs = new Dictionary<int, BigInteger>();
32 
33         static FibonacciRef()
34         {
35             fibs[0] = BigInteger.Zero;
36             fibs[1] = BigInteger.One;
37             fibs[2] = BigInteger.One;
38             fibs[3] = fibs[2] + fibs[1];
39             fibs[4] = fibs[3] + fibs[2];
40             fibs[5] = fibs[4] + fibs[3];
41         }
42 
43         private static BigInteger calcFib(int n)
44         {
45             BigInteger result;
46             if (fibs.TryGetValue(n, out result))
47                 return result;
48 
49             if ((n & 1) == 1)
50             {
51 
52                 int k = (n + 1) / 2;
53                 BigInteger fk = BigInteger.Pow(calcFib(k), 2);
54                 BigInteger fkm1 = BigInteger.Pow(calcFib(k - 1), 2);
55                 result = fk + fkm1;
56             }
57             else
58             {
59                 int k = n / 2;
60                 BigInteger fk = calcFib(k);
61                 BigInteger fkm1 = calcFib(k - 1);
62                 result = (fkm1 * fibs[3] + fk) * fk;
63             }
64 
65             fibs[n] = result;
66             return result;
67         }
68 
69         public static BigInteger fib(int n)
70         {
71             bool neg = n < 0;
72 
73             if (neg)
74                 n = -n;
75 
76             BigInteger result = calcFib(n);
77 
78             if (neg && (n & 1) == 0)
79                 result = -result;
80 
81             return result;
82         }
83     }
84 }

?文章來源地址http://www.zghlxwxcb.cn/news/detail-695047.html

到了這里,關(guān)于【算法】斐波那契數(shù)列與臺風(fēng)的故事的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【算法優(yōu)選】 動(dòng)態(tài)規(guī)劃之斐波那契數(shù)列模型

    動(dòng)態(tài)規(guī)劃相關(guān)題目都可以參考以下五個(gè)步驟進(jìn)行解答: 狀態(tài)表? 狀態(tài)轉(zhuǎn)移?程 初始化 填表順序 返回值 后面題的解答思路也將按照這五個(gè)步驟進(jìn)行講解。 泰波那契序列 Tn 定義如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的條件下 Tn+3 = Tn + Tn+1 + Tn+2 給你整數(shù) n,請返回第 n 個(gè)泰波那契

    2024年02月05日
    瀏覽(25)
  • 一分鐘學(xué)算法-遞歸-斐波那契數(shù)列遞歸解法及優(yōu)化

    一分鐘學(xué)算法-遞歸-斐波那契數(shù)列遞歸解法及優(yōu)化

    一分鐘學(xué)一個(gè)算法題目。 今天我們要學(xué)習(xí)的是用遞歸算法求解斐波那契數(shù)列。 視頻教程鏈接:https://www.bilibili.com/video/BV1Wu4y1i7JJ/ 首先我們要知道什么是斐波那契數(shù)列。 斐波那契數(shù)列,又稱黃金分割數(shù)列,是一個(gè)經(jīng)典的數(shù)學(xué)數(shù)列,其特點(diǎn)是第一項(xiàng),第二項(xiàng)為1,后面每個(gè)數(shù)字都

    2024年02月11日
    瀏覽(27)
  • 遞歸以及斐波那契數(shù)列遞歸算法和迭代算法的實(shí)現(xiàn)與分析

    遞歸以及斐波那契數(shù)列遞歸算法和迭代算法的實(shí)現(xiàn)與分析

    程序調(diào)用自身的編程技巧稱為遞歸( recursion) 遞歸有兩個(gè)過程,簡單地說一個(gè)是 遞的過程 ,一個(gè)是 歸的過程 。 遞歸的兩個(gè)必要條件 1. 存在限制條件 ,當(dāng)滿足這個(gè)限制條件的時(shí)候,遞歸便不再繼續(xù)。 2.每次遞歸調(diào)用之后越來越 接近這個(gè)限制條件 . 遞歸本質(zhì)就是函數(shù)調(diào)用

    2024年02月12日
    瀏覽(17)
  • Java數(shù)據(jù)結(jié)構(gòu)與算法:動(dòng)態(tài)規(guī)劃之斐波那契數(shù)列

    大家好,我是免費(fèi)搭建查券返利機(jī)器人賺傭金就用微賺淘客系統(tǒng)3.0的小編。在這寒冷的季節(jié)里,讓我們一同探討Java中的動(dòng)態(tài)規(guī)劃,重點(diǎn)關(guān)注解決問題的經(jīng)典代表之一——斐波那契數(shù)列。 動(dòng)態(tài)規(guī)劃簡介 動(dòng)態(tài)規(guī)劃是一種解決問題的數(shù)學(xué)方法,通常用于優(yōu)化遞歸算法。它通過將問

    2024年01月22日
    瀏覽(21)
  • 線性代數(shù) --- 計(jì)算斐波那契數(shù)列第n項(xiàng)的快速算法(矩陣的n次冪)

    線性代數(shù) --- 計(jì)算斐波那契數(shù)列第n項(xiàng)的快速算法(矩陣的n次冪)

    The n-th term of Fibonacci Numbers: ????????斐波那契數(shù)列的是一個(gè)古老而又經(jīng)典的數(shù)學(xué)數(shù)列,距今已經(jīng)有800多年了。關(guān)于斐波那契數(shù)列的計(jì)算方法不難,只是當(dāng)我們希望快速求出其數(shù)列中的第100,乃至第1000項(xiàng)時(shí),有沒有又準(zhǔn)又快的方法,一直是一個(gè)值得探討和研究的問題。筆者

    2024年04月27日
    瀏覽(16)
  • JAVA-斐波那契數(shù)列

    輸入一個(gè)整數(shù) n ,求斐波那契數(shù)列的第 n 項(xiàng)。 假定從 0 開始,第 0 項(xiàng)為 0 。 數(shù)據(jù)范圍 0≤n≤39 樣例

    2024年02月10日
    瀏覽(23)
  • 斐波那契數(shù)列應(yīng)用2

    目錄 斐波那契數(shù)列應(yīng)用2 程序設(shè)計(jì) 程序分析? 系列文章 【問題描述】定義如下序列:f(1)=1,f(2)=1;f(n)=(A*f(n-1)+B*f(n-2))mod7? ? ?給定A和B,請你計(jì)算f(n)的值。 【輸

    2023年04月10日
    瀏覽(26)
  • Python斐波那契數(shù)列

    斐波那契數(shù)列是一個(gè)經(jīng)典的數(shù)學(xué)問題,在 Python 中可以使用多種方法來實(shí)現(xiàn),下面是幾個(gè)常見的實(shí)現(xiàn)方式: 1. 使用遞歸 ```python def fibonacci_recursive(n): ? ? if n = 1: ? ? ? ? return n ? ? else: ? ? ? ? return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) ``` 2. 使用循環(huán) ```python def fibonacci_i

    2024年02月02日
    瀏覽(23)
  • 矩陣快速冪&斐波那契數(shù)列

    矩陣快速冪&斐波那契數(shù)列

    矩陣快速冪: 快速地求出斐波那契數(shù)列中的每一項(xiàng) 可以快速地求出斐波那契數(shù)列的前n項(xiàng)的和 首先我們來看如何快速地求出斐波那契數(shù)列的第n項(xiàng) 設(shè) F n = [ f n , f n + 1 ] F_n = [f_n,f_{n+1}] F n ? = [ f n ? , f n + 1 ? ] ,構(gòu)造這一個(gè)行向量,那么對于此,我們思考 F n F_n F n ? 乘一個(gè)

    2024年02月06日
    瀏覽(18)
  • 斐波那契數(shù)列verilog實(shí)現(xiàn)

    斐波那契數(shù)列verilog實(shí)現(xiàn)

    ?前言: ????????該題為睿思芯科筆試題,筆試時(shí)長20分鐘。 ????????用代碼實(shí)現(xiàn)斐波那契數(shù)列,代碼需要對對enable敏感,當(dāng)enable為高幾周期,sum在enble為高的下一周期輸出第幾個(gè)斐波那契數(shù),斐波那契數(shù)列的生成是后一個(gè)數(shù)字是前兩個(gè)數(shù)字之和,如下序列:0、1、1、

    2024年02月13日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包