再帰アルゴリズムと最適化アルゴリズムの比較

再帰アルゴリズムと最適化アルゴリズムの比較

以前、「【インタビュー】 - 低速反応再帰」で 3 つの再帰アルゴリズムを読みました。フィボナッチ数列の最適化後のアルゴリズムのアイデアは確かに優れていますが、最後の 2 つの数列に再帰を使用する場合、個人的には労力に見合わないと感じています。再帰を回避できる場合は、再帰を使用しないようにしてください。一部のアルゴリズムは数学を使用して完全に解決できるためです。したがって、この論文では、これら 3 つのシリーズの最終的なアルゴリズムを次のようにまとめています。

1. 配列 1,1,2,3,5,8,13... の 30 番目のビットの値を計算します。

再帰アルゴリズムは次のとおりです。

  1. パブリック静的 int CalculateFibonacciSequence(int インデックス)
  2. {
  3. (インデックス< = 0)の場合
  4. {
  5. 0を返します。
  6. }
  7.  
  8. if (インデックス== 1 ||インデックス== 2)
  9. {
  10. 1 を返します。
  11. }
  12.  
  13. CalculateFibonacciSequence(インデックス - 1) + CalculateFibonacciSequence(インデックス - 2) を返します。
  14. }

再帰アルゴリズムを使用して計算する場合、繰り返し操作が多くなります。配列を使用すると、比較的効率的です。最終的なアルゴリズムは次のようになります。

  1. パブリック静的 int CalculateFibonacciSequence(int インデックス)
  2. {
  3. (インデックス< = 0)の場合
  4. {
  5. 0を返します。
  6. }
  7.  
  8. if (インデックス== 1 ||インデックス== 2)
  9. {
  10. 1 を返します。
  11. }
  12.  
  13. int[] fibonacciArray =新しいint[インデックス];
  14. フィボナッチ配列[0] = 1;
  15. フィボナッチ配列[1] = 1;
  16.  
  17. (int innerIndex = 2 ; innerIndex <   fibonacciArray.Length ; innerIndex++) フィボナッチ配列の長さ; innerIndex++)
  18. {
  19. fibonacciArray[innerIndex] = fibonacciArray[innerIndex - 1] + fibonacciArray[innerIndex - 2];
  20. }
  21.  
  22. fibonacciArray[インデックス - 1]を返します。
  23. }

フィボナッチ数列の場合、一般式は Fn=F(n-1)+F(n-2)(n>=2, n∈N*) であり、計算を 1 回ループするだけで必要な値が得られます。

2. 1+2+3+4+...+nの値を計算する

再帰アルゴリズムは次のとおりです。

  1. パブリック静的 int CalculateNumberSequenceCount(int インデックス)
  2. {
  3. (インデックス< = 0)の場合
  4. {
  5. 0を返します。
  6. }
  7.  
  8. CalculateNumberSequenceCount(インデックス - 1) + インデックスを返します。
  9. }

数値 (インデックス) が非常に大きい場合、上記の再帰アルゴリズムでは間違いなく問題が発生します。以下に示す最終的なアルゴリズムを見てみましょう。

  1. パブリック静的 int CalculateNumberSequenceCount(int インデックス)
  2. {
  3. (インデックス< = 0)の場合
  4. {
  5. 0を返します。
  6. }
  7.  
  8. インデックス * (インデックス + 1) / 2 を返します。
  9. }

1+2+3+4+...+n は、高校数学の等差数列の和の完全に特殊なケースです。 1+2+3+4+......+n は (最初の項 + 最後の項)*項の数/2 に等しいので、結果は n(n+1)/2 になります。これは再帰なしでも解くことができ、式を適用するだけです。

3. 1-2+3-4+5-6+7+...+nの値を計算します。

再帰アルゴリズムは次のとおりです。

  1. パブリック静的 int CalculateNumberSequence(int インデックス)
  2. {
  3. (インデックス< =0)の場合
  4. {
  5. 0を返します。
  6. }
  7.  
  8. インデックス % 2 == 0 を返します。CalculateNumberSequence(index - 1) - index : CalculateNumberSequence(index - 1) + index;
  9. }

1-2+3-4+5-6+7+...+n の場合、次の 2 つのケースに分けられます。

(1) nが偶数のとき、1-2+3-4+5-6+7+...+n=(1-2)+(3-4)+(5-6)+...+[(n-1)-n]

=-1×(n/2)

=-n/2

(2)nが奇数のとき、1−2+3−4+5−6+7+...+n=(1−2)+(3−4)+(5−6)+...+[(n−2)−(n−1)]+n

=-1×(n-1)/2 +n

=(n+1)/2

したがって、最終的なアルゴリズムは次のようになります。

  1. パブリック静的 int CalculateCrossNumberSequence(int インデックス)
  2. {
  3. (インデックス< =0)の場合
  4. {
  5. 0を返します。
  6. }
  7.  
  8. インデックス % 2 == 0 を返します。-インデックス / 2 : (インデックス + 1) / 2;
  9. }

数学的に解決できる問題の場合は、再帰を使用して計算しないようにしてください。もちろん、多くの場合、再帰は依然として必要です。これは再帰アルゴリズムが悪いと言っているのではなく、特定の問題を解決するために最善の方法を使用することが最終的な解決策であるということです。これがお役に立てば幸いです。

オリジナル: http://www.cnblogs.com/jasenkin/archive/2012/02/22/recursion_math_algorithm_comparion.html

【編集者のおすすめ】

  1. マット・カッツのブログ記事: Google のアルゴリズムの 10 のベストな調整
  2. 簡単なアルゴリズムからアセンブリ言語の予備的研究
  3. アルゴリズム学習のための動的プログラミング戦略の紹介
  4. 百度、検索エンジンアルゴリズムを調整して微博コンテンツのインデックスを強化
  5. 過去10年間のGoogleアルゴリズムの変化

<<:  ユーザー投票に基づくランキングアルゴリズム: Delicious と Hacker News

>>:  研究者らがRSA公開鍵生成アルゴリズムの脆弱性を発見

ブログ    
ブログ    

推薦する

人工知能の時代に、人間の知能は不可欠なのでしょうか?

今日のビジネスは急速に変化しています。意思決定をするのに人間の知恵だけに頼るだけでは不十分です。その...

顔認識の国家基準に関する意見募集:顔のスキャンや嗜好予測の義務化はなし

近年、顔認証が話題になっていますが、現実には、通知なく顔認証データを取得したり、強制的に顔認証させら...

「コピー+貼り付け」に別れを告げ、ディープラーニングOCRに基づくPDFからテキストへの変換を実現

[[403226]]従来の講義には通常、PDF スライドのセットが付属します。一般的に、このような講...

...

...

WeChat、サードパーティのエコシステムに統合するインテリジェント会話システム「Xiaowei」を発表

2019年WeChatオープンクラスPROで、WeChat AIチームが開発したインテリジェント対話...

GPT の成熟への道に関する公式メモ | OpenAI Developer Day

OpenAI は ChatGPT 製品の作成の詳細を明らかにしました。そして、この共有の波は、次の...

BATのアルゴリズムエンジニアにまた拒否された

[[186071]]今日、私は BAT のアルゴリズム エンジニアに再び拒否されました。はい、お読み...

来年のIT投資の見通しは有望です。成長率はGDPの3倍です。 CIOの75%がAIへの支出を増やす

現在、世界経済の回復は依然として緩やかです。国際通貨基金(IMF)が最近発表した世界経済見通しレポー...

iPhoneXの顔認識はどのようなデータセキュリティの考え方を誘発するのでしょうか?

[[204618]]今年のAppleカンファレンスでは、iPhone Xの「フロントバン」が観客の...

ロシアの国家人工知能戦略についての考察

各国は独自の野心的な国家人工知能戦略を発表しており、ロシアも例外ではない。ロシアが今後10年間に人工...

清華大学チームは、蛍光画像から自己教師あり方式でノイズを除去する空間冗長性ノイズ除去トランスフォーマー法を開発

高い信号対雑音比を備えた蛍光イメージングは​​、生物学的現象の正確な可視化と分析の基礎となっています...

ジャック・マーの未来の3大技術、AI、IoT、ブロックチェーンを理解する

ジャック・マー氏は今年の中国科学技術協会年次総会の開会式で、今後10年から20年の間に社会全体に大き...

数百万の量子ビットを実現するにはどうすればよいでしょうか?量子コンピューティング企業がユニバーサル量子コンピューティングソリューションを拡大

光ファイバーを光子のメモリとして使用し、光子メモリを使用してフォールトトレラント量子コンピューティン...