Baidu には「フィボナッチの非再帰記述」に対する回答がたくさんありますが、第一に難しすぎて理解できないこと、第二に再帰とパフォーマンスが似ていることなど、満足のいくものではありません。
フィボナッチ数列に関して言えば、初心者のプログラマであっても技術のベテランであっても、最初に思い浮かぶのは間違いなく再帰的な記述方法です。そして、技術のベテランとプログラムの初心者の違いは、計算の繰り返しを減らすために再帰の結果を保存することを考えるかどうかです。これらは非常に一般的な演算ですが、フィボナッチ数列が非再帰的な方法でも記述できると考えたことはありますか?
Baidu には「フィボナッチの非再帰記述」に対する回答がたくさんありますが、第一に難しすぎて理解できないこと、第二に再帰とパフォーマンスが似ていることなど、満足のいくものではありません。最初は、再帰呼び出しのコールスタックをシミュレートするものであれば、自分でも作成したいと思っていましたが、この考えは少し当たり前のことであり、作成されるプログラムも非常に複雑です。どうやってするの?このとき、ツリーの深さ優先走査が便利です。
最初に、ツリー ノードを定義します。
public class Node { public Node(long value, bool visited) { Value = value; Visited = visited; } public long Value { get; set; }//存放结点的值 public bool Visited { get; set; } }
その後、DFS のスタックの書き方を楽しく学ぶことができます
public static long Fblc(int n) { Stack<Node> s = new Stack<Node>(); s.Push(new Node(n, false)); long sum = 0; long[] childrenResultMemo = new long[n+1]; childrenResultMemo[0] = 1; childrenResultMemo[1] = 1; //long children = 0; while (s.Any()) { var cur = s.Pop(); if (cur.Visited == false) { if (childrenResultMemo[cur.Value] == 0) { cur.Visited = true; if (childrenResultMemo[cur.Value - 1] != 0 && childrenResultMemo[cur.Value - 2] != 0) { var result = childrenResultMemo[cur.Value - 1] + childrenResultMemo[cur.Value - 2]; childrenResultMemo[cur.Value] = result; sum += result; s.Push(cur); } else { s.Push(cur); s.Push(new Node(cur.Value - 1, false)); s.Push(new Node(cur.Value - 2, false)); } } else { sum += childrenResultMemo[cur.Value];//保存子树结果的优化,会有个特殊情况要处理 } } } return sum; }
上記のアルゴリズムの中心的な考え方は、トラバースすることです。スタックを呼び出してスタックをポップアウトします。最上位の要素が訪問されている場合 (visited が true)、スキップします (上記のコードはサブツリー結果の保存の最適化を使用しています。処理される特別なケースがあります。これについては以下で詳しく説明します)。 ; それ以外の場合、現在の親ノード 訪問済みマークは true、つまり訪問されてスタックにプッシュされたことを意味し、その後、そのすべての子ノードがスタックにプッシュされます。
この考え方に従うと、作成するコードは上記とは異なります。コードの量ははるかに少なく、より簡潔になります。ただし、アルゴリズムの複雑さは再帰的アルゴリズムの複雑さと同様になります。計算が繰り返されるため、書き込みます。
何をすべきでしょうか? 解決策は 1 つだけです。空間を時間と交換し、サブツリーの結果を保存します。対応するサブツリーが計算され、結果が得られている場合、次のサブツリーの深さはトラバースしません。結果を直接使用します。サブツリーの結果を配列に保存します。
long[] childrenResultMemo = new long[n+1];
通常、サブツリーにすでに結果がある場合、論理的にはそのサブツリーにアクセスする必要があります。ただし、先頭にサブツリー 0 とサブツリー 1 がある特殊なケースもあります:
childrenResultMemo[0] = 1; childrenResultMemo[1] = 1;
この特殊なケースのブランチに結果を追加するだけです:
sum += childrenResultMemo[cur.Value];
この書き方はどうでしょうか?めったに見られない?実際、フィボナッチ数列の評価プロセスは、ツリーの深さ優先の走査に似ています。したがって、深さ優先トラバーサルの実装である限り、完全に実現可能です。
関連記事:
関連動画:以上がフィボナッチ数列もこのように書かれていることが分かりました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

C#.NETエコシステムは、開発者がアプリケーションを効率的に構築できるようにするための豊富なフレームワークとライブラリを提供します。 1.ASP.NETCOREは、高性能Webアプリケーションの構築に使用されます。2.EntityFrameWorkCoreは、データベース操作に使用されます。これらのツールの使用とベストプラクティスを理解することにより、開発者はアプリケーションの品質とパフォーマンスを向上させることができます。

c#.netアプリをAzureまたはAWSに展開する方法は?答えは、AzureAppServiceとAwselasticBeanStalkを使用することです。 1。Azureでは、AzureAppServiceとAzurePipelinesを使用して展開を自動化します。 2。AWSでは、Amazon ElasticBeanstalkとAwslambdaを使用して、展開とサーバーレス計算を実装します。

C#と.NETの組み合わせにより、開発者に強力なプログラミング環境を提供します。 1)C#は、多型と非同期プログラミングをサポートします。2).NETは、クロスプラットフォーム機能と同時処理メカニズムを提供し、デスクトップ、Web、モバイルアプリケーション開発で広く使用されています。

.NetFrameworkはソフトウェアフレームワークであり、C#はプログラミング言語です。 1..netframeworkは、デスクトップ、Web、モバイルアプリケーションの開発をサポートするライブラリとサービスを提供します。 2.C#は.NetFrameWork用に設計されており、最新のプログラミング機能をサポートしています。 3..NetFrameworkはCLRを介してコード実行を管理し、C#コードはILにコンパイルされ、CLRによって実行されます。 4. .NetFrameWorkを使用してアプリケーションをすばやく開発し、C#はLINQなどの高度な関数を提供します。 5.一般的なエラーには、タイプ変換と非同期プログラミングデッドロックが含まれます。 VisualStudioツールは、デバッグに必要です。

C#は、Microsoftが開発した最新のオブジェクト指向プログラミング言語であり、.NETはMicrosoftが提供する開発フレームワークです。 C#は、CのパフォーマンスとJavaのシンプルさを組み合わせており、さまざまなアプリケーションの構築に適しています。 .NETフレームワークは、複数の言語をサポートし、ガベージコレクションメカニズムを提供し、メモリ管理を簡素化します。

C#と.NETランタイムは密接に連携して、開発者に効率的で強力なプラットフォームの開発機能に力を与えます。 1)C#は、.NETフレームワークとシームレスに統合するように設計されたタイプセーフおよびオブジェクト指向のプログラミング言語です。 2).NETランタイムは、C#コードの実行を管理し、ガベージコレクション、タイプの安全性、その他のサービスを提供し、効率的でクロスプラットフォームの操作を保証します。

C#.NET開発を開始するには、次のことが必要です。1。C#の基本的な知識と.NETフレームワークのコア概念を理解する。 2。変数、データ型、制御構造、関数、クラスの基本概念をマスターします。 3。LINQや非同期プログラミングなど、C#の高度な機能を学習します。 4.一般的なエラーのためのデバッグテクニックとパフォーマンス最適化方法に精通してください。これらの手順を使用すると、C#.NETの世界に徐々に浸透し、効率的なアプリケーションを書き込むことができます。

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
