递归算法事例

Jun 13, 2016 am 10:56 AM
c++ int 1つ 印刷する 埋め込む プログラム アルゴリズム 仕上げる 行番号 声明 再帰

一.例子(用从C++描述):

    行号      程序

          0         p (int w)

          1         {if( w>o)

          2          { cout

          3             p(w-1);

          4            p(w-1);

          5          }

   6         }

    结束

 

   执行语句 p(4) 后的打印结果:4 3 2 1 1 2 1 1 3 2 1 1 2 1 1

 

二.说明:

1.递归调用与普通的调用原理相同,只不过是每次调用的函数都是自己本身。

2.我们完全可以自己编程设置堆栈(用户堆栈),来实现与“递归调用”相同的功能。

3.   3.在“递归调用”时,系统会自动设置和管理堆栈(系统堆栈),而

      无需我们的干预,但这同时增加了“递归调用”的神秘性。为了更好

地    地理解“递归调用”,现将系统堆栈以表格的方式表示出来。

4.对于“堆栈”格式的一些说明

   堆栈的格式为:

方格a
 方格b
 方格c
 
函数调用完返回的行号
 调用的函数
 W 的值
 

    每调用一次函数就“入栈”一次;函数执行完了,就“出栈”一次

 

三.程序解释:

1.开始调用p(4),此时执行的语句有:1、2、3

结束
 P(4)
 4
 

    执行p(4)的语句2:cout

但是由于语句3,在执行过程中还要调用p(3),只有p(3)执行完了,才能继续执行p(4)。

 

        2.开始调用P(3),此时执行的语句有:1、2、3

4
 P(3)
 3
 
结束
 P(4)
 4
 

    当p(3)执行完了,就会执行p(4)中的语句4(所以在方格a中,填“4”)。

    执行p(3)的语句2:cout

同上面的情况相同,当执行到语句3,还要调用p(2),只有p(2)执行完了,才能继续执行p(3)。

 

3.开始调用P(2),此时执行的语句有:1、2、3

4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    执行p(2)的语句2:cout

同上面的情况相同,当执行到语句3,还要调用p(1),只有p(1)执行完了,才能继续执行p(2)。

 

4.开始调用P(1),此时执行的语句有:1、2、3

4
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    执行p(2)的语句2:cout

同上面的情况相同,当执行到语句3,还要调用p(0),只有p(0)执行完了,才能继续执行p(1)。

 

5.开始调用P(0),此时执行的语句有:1

4
 P(0)
 0
 
4
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    因为w=0不满足语句1,所以直接跳到语句5、6,从而p(0)执行完毕,p(0)要进行“出栈”操作。

 

        6.此时执行的语句有:4

4
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(0)执行完成,且p(0)的方格a中为4,因此继续执行p(1)的语句4 :p(w-1); 又由于p(1)方格c中w值为1,所以调用p(0)。

7.开始调用p(0)

5
 P(0)
 0
 
4
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    当p(0)执行完了,就会执行p(1)中的语句5(所以在方格a中,填“5”)。

    因为w=0不满足语句1,所以直接跳到语句5、6,从而p(0)执行完毕,p(0)要进行“出栈”操作。

 

     8.此时执行的语句有:5

4
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(0)执行完成,且p(0)的方格a中为5,因此继续执行p(1)的语句5 (最后一句),所以p(1)执行完毕,p(1)要进行“出栈”操作。

 

     9.

4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(1)执行完成,且p(1)的方格a中为4,因此继续执行p(2)的语句4 :p(w-1); 又由于p(2)方格c中w值为2,所以调用p(1)。

 

 10.开始调用P(1),此时执行的语句有:1、2、3

5
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    当p(1)执行完了,就会执行p(2)中的语句5(所以在方格a中,填“5”)。

    执行p(1)的语句2:cout

当执行到语句3,还要调用p(0),只有p(0)执行完了,才能继续执行p(1)。

 

11.始调用P(0),此时执行的语句有:1

4
 P(0)
 0
 
5
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    因为w=0不满足语句1,所以直接跳到语句5、6,从而p(0)执行完毕,p(0)要进行“出栈”操作。

 

        12.此时执行的语句有:4

5
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(0)执行完成,且p(0)的方格a中为4,因此继续执行p(1)的语句4 :p(w-1);又由于p(1)方格c中w值为1,所以调用p(0)。

 

       13.开始调用p(0)

5
 P(0)
 0
 
5
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    当p(0)执行完了,就会执行p(1)中的语句5(所以在方格a中,填“5”)。

    因为w=0不满足语句1,所以直接跳到语句5、6,从而p(0)执行完毕,p(0)要进行“出栈”操作。

14.此时执行的语句有:5

5
 P(1)
 1
 
4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(0)执行完成,且p(0)的方格a中为5,因此继续执行p(1)的语句5 (最后一句),所以p(1)执行完毕,p(1)要进行“出栈”操作。

 

        15.

4
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(1)执行完成,且p(1)的方格a中为5,因此继续执行p(2)的语句5 (最后一句),所以p(2)执行完毕,p(2)要进行“出栈”操作。

 

    注意:其实步骤10~15重复了步骤4~9,因为它们都调用的P(1)

 

       16.

4
 P(3)
 3
 
结束
 P(4)
 4
 

    由于p(2)执行完成,且p(2)的方格a中为4,因此继续执行p(3)的语句4 :p(w-1); 又由于p(3)方格c中w值为3,所以调用p(2)。

 

       17.开始调用P(2),此时执行的语句有:1、2、3

5
 P(2)
 2
 
4
 P(3)
 3
 
结束
 P(4)
 4
 

    当p(2)执行完了,就会执行p(3)中的语句5(所以在方格a中,填“5”)。

    执行p(2)的语句2:cout

 

    同上面的情况相同,当执行到语句3,还要调用p(1),只有p(1)执行完了,才能继续执行p(2)。

 

        18.开始调用p(1)

    省略……

    注意:其实步骤17~29重复了3~15,因为它们都调用的P(2)

    在这步骤中,又打印了2 1 1(见步骤3、4、10)

 

四.结论与分析:

步骤
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
结果
 4
 3
 2
 1
 1
 2
 1
 1
 3
 2
 1
 1
 2
 1
 1
 

第5个结果重复第4个结果,这是因为他们都调用了p(1)

第6、7、8个结果重复第3、4、5个结果,这是因为他们都调用了p(2)

第9~15个结果重复第2~8个结果,这是因为他们都调用了p(3)

 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ オブジェクトのレイアウトはメモリに合わせて調整され、メモリの使用効率が最適化されます。 C++ オブジェクトのレイアウトはメモリに合わせて調整され、メモリの使用効率が最適化されます。 Jun 05, 2024 pm 01:02 PM

C++ オブジェクト レイアウトとメモリ アライメントにより、メモリ使用効率が最適化されます。 オブジェクト レイアウト: データ メンバーは宣言の順序で格納され、スペース使用率が最適化されます。メモリのアライメント: アクセス速度を向上させるために、データがメモリ内でアライメントされます。 alignas キーワードは、キャッシュ ラインのアクセス効率を向上させるために、64 バイトにアライメントされた CacheLine 構造などのカスタム アライメントを指定します。

改良された検出アルゴリズム: 高解像度の光学式リモートセンシング画像でのターゲット検出用 改良された検出アルゴリズム: 高解像度の光学式リモートセンシング画像でのターゲット検出用 Jun 06, 2024 pm 12:33 PM

01 今後の概要 現時点では、検出効率と検出結果の適切なバランスを実現することが困難です。我々は、光学リモートセンシング画像におけるターゲット検出ネットワークの効果を向上させるために、多層特徴ピラミッド、マルチ検出ヘッド戦略、およびハイブリッドアテンションモジュールを使用して、高解像度光学リモートセンシング画像におけるターゲット検出のための強化されたYOLOv5アルゴリズムを開発しました。 SIMD データセットによると、新しいアルゴリズムの mAP は YOLOv5 より 2.2%、YOLOX より 8.48% 優れており、検出結果と速度のバランスがより優れています。 02 背景と動機 リモート センシング技術の急速な発展に伴い、航空機、自動車、建物など、地表上の多くの物体を記述するために高解像度の光学式リモート センシング画像が使用されています。リモートセンシング画像の判読における物体検出

C++ で戦略デザイン パターンを実装するにはどうすればよいですか? C++ で戦略デザイン パターンを実装するにはどうすればよいですか? Jun 06, 2024 pm 04:16 PM

C++ でストラテジ パターンを実装する手順は次のとおりです。ストラテジ インターフェイスを定義し、実行する必要があるメソッドを宣言します。特定の戦略クラスを作成し、それぞれインターフェイスを実装し、さまざまなアルゴリズムを提供します。コンテキスト クラスを使用して、具体的な戦略クラスへの参照を保持し、それを通じて操作を実行します。

Golang と C++ の類似点と相違点 Golang と C++ の類似点と相違点 Jun 05, 2024 pm 06:12 PM

Golang と C++ は、それぞれガベージ コレクションと手動メモリ管理のプログラミング言語であり、構文と型システムが異なります。 Golang は Goroutine を通じて同時プログラミングを実装し、C++ はスレッドを通じて同時プログラミングを実装します。 Golang のメモリ管理はシンプルで、C++ の方がパフォーマンスが優れています。実際の場合、Golang コードはより簡潔であり、C++ には明らかにパフォーマンス上の利点があります。

C++ スマート ポインターの基本的な実装原則は何ですか? C++ スマート ポインターの基本的な実装原則は何ですか? Jun 05, 2024 pm 01:17 PM

C++ スマート ポインターは、ポインター カウント、デストラクター、仮想関数テーブルを通じて自動メモリ管理を実装します。ポインター カウントは参照の数を追跡し、参照の数が 0 に低下すると、デストラクターは元のポインターを解放します。仮想関数テーブルによりポリモーフィズムが可能になり、さまざまなタイプのスマート ポインターに対して特定の動作を実装できるようになります。

C++ でネストされた例外処理を実装するにはどうすればよいですか? C++ でネストされた例外処理を実装するにはどうすればよいですか? Jun 05, 2024 pm 09:15 PM

ネストされた例外処理は、ネストされた try-catch ブロックを通じて C++ に実装され、例外ハンドラー内で新しい例外を発生させることができます。ネストされた try-catch ステップは次のとおりです。 1. 外側の try-catch ブロックは、内側の例外ハンドラーによってスローされた例外を含むすべての例外を処理します。 2. 内部の try-catch ブロックは特定のタイプの例外を処理し、スコープ外の例外が発生した場合、制御は外部例外ハンドラーに渡されます。

画期的な CVM アルゴリズムが 40 年以上の計数の問題を解決します。コンピューター科学者がコインを投げて「ハムレット」を表す固有の単語を割り出す 画期的な CVM アルゴリズムが 40 年以上の計数の問題を解決します。コンピューター科学者がコインを投げて「ハムレット」を表す固有の単語を割り出す Jun 07, 2024 pm 03:44 PM

数を数えるのは簡単そうに思えますが、実際にやってみるととても難しいです。あなたが野生動物の個体数調査を実施するために自然のままの熱帯雨林に運ばれたと想像してください。動物を見かけたら必ず写真を撮りましょう。デジタル カメラでは追跡された動物の総数のみが記録されますが、固有の動物の数に興味がありますが、統計はありません。では、このユニークな動物群にアクセスする最善の方法は何でしょうか?この時点で、今すぐ数え始めて、最後に写真から各新種をリストと比較すると言わなければなりません。ただし、この一般的なカウント方法は、数十億エントリに達する情報量には適さない場合があります。インド統計研究所、UNL、およびシンガポール国立大学のコンピューター科学者は、新しいアルゴリズムである CVM を提案しました。長いリスト内のさまざまな項目の計算を近似できます。

C++ STL コンテナを反復するにはどうすればよいですか? C++ STL コンテナを反復するにはどうすればよいですか? Jun 05, 2024 pm 06:29 PM

STL コンテナを反復するには、コンテナの begin() 関数と end() 関数を使用してイテレータ範囲を取得できます。 ベクトル: for ループを使用してイテレータ範囲を反復します。リンク リスト: next() メンバー関数を使用して、リンク リストの要素を移動します。マッピング: キーと値のイテレータを取得し、for ループを使用してそれを走査します。

See all articles