技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
Java語言實現:
Java 的實現和C語言的實現一致,不再撰述。
代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
Java語言實現:
Java 的實現和C語言的實現一致,不再撰述。
代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
Java語言實現:
Java 的實現和C語言的實現一致,不再撰述。
代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
Java語言實現:
Java 的實現和C語言的實現一致,不再撰述。
代碼如下:
Python語言實現:
Python 的實現和C語言的實現一致,不再撰述。
代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
Java語言實現:
Java 的實現和C語言的實現一致,不再撰述。
代碼如下:
Python語言實現:
Python 的實現和C語言的實現一致,不再撰述。
代碼如下:
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。
如果有任何問題可以在文章後評論或者私信給我。
如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。
持續分享,敬請關注。
LeetCode 1137. 求第N個泰波拿契數(N-th Tribonacci Number)
問題描述:
注:
- 0 <= n <= 37;
- 答案是一個32位整數,即。res <= 2^31 - 1;
示例:
C語言實現:
泰波拿契數是斐波那契數的擴展。它的求法與求斐波那契數類似,但是要複雜一些。
方法一:遞歸或者循環
我們依然可以用循環或者遞歸,像求斐波那契數那樣求泰波拿契數。
我這裡只說遞歸方法,因為遞歸代碼要更簡潔一些。
一個泰波拿契數是它前面的3個數的和,所以對於前3個數(0,1,1)我們直接賦值,無需計算。
其他的則返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。
但是這裡要注意,如果簡單的這樣處理,那麼會有大量的重複計算。當n增大,效率會迅速下降。
為了避免重複計算,對於已經計算過的數,要存起來,下次用的時候直接取。鑑於題目要求n不大於37,所以我們定義一個長度時38的數組T來保存這些數。
方法二:通項公式
在前面我講,如何求第n個斐波那契數時,我提到了用數列的通項公式一次求出。在這裡我們試著求出泰波拿契數的通項公式。
對於一個泰波拿契數數列,我們可以得出如下的關係:
可以得到A的特徵方程:
解這個一元三次方程得到它的3個解, α,β 和 γ :
其種 α 是唯一的實根,是一個無理數。
β 和 γ 是兩個共軛複數根。
因此它的比內公式表示為:
(篇幅有限,關於其比內公式的推導,見https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)
第一次看到這個公式很錯愕,無理數和複數的和得到一個整實數,多麼神奇。
看到這裡的朋友一定很好奇算法怎麼實現。
其實該比內公式的後兩項對結果的影響非常小,只對Tn的精度有非常小的影響,我們可以簡化成:
這個符號表示對結果進行四捨五入。我實際測試的結果: 對n小於57的任意Tn 都不受影響。完全滿足題目要求。
兩種算法的代碼如下:
Java語言實現:
Java 的實現和C語言的實現一致,不再撰述。
代碼如下:
Python語言實現:
Python 的實現和C語言的實現一致,不再撰述。
代碼如下: