C 言語 - 関数のネストされた呼び出し、チェーン アクセス、関数の宣言と定義、関数の再帰。

関数のネストされた呼び出し、連鎖アクセス。

関数はネストして呼び出すことができますが、ネストして定義することはできません。つまり、関数を関数内で再度定義することはできません。ただし、関数内で他の関数を呼び出すことはできます。

ネストされた呼び出し:関数内で別の関数を呼び出すことです。

チェーンアクセス: 1 つの関数の戻り値を別の関数のパラメーターとして使用します。

次の図は、strlen の戻り値を printf のパラメータとして使用したチェーンアクセスです。

//printf の戻り値は印刷された文字数です (%d の後に \n を追加すると、スペースなどはすべて文字になることに注意してください)。エラーが発生した場合は負の数が返されます。

関数の宣言と定義

関数宣言:

1. 関数の名前、パラメータ、戻り値の型をコンパイラに伝えます。しかし、それが存在するかどうかは、関数宣言では決定できません。

2. 関数の宣言は通常、関数を使用する前に記述されます。使用前に宣言する必要があります。

3. 関数の宣言は通常、ヘッダー ファイルに配置する必要があります。

例えば

関数の定義が呼び出しの後にある場合は、図 2 のように関数 Add が未定義であることを示す警告がポップアップ表示されます。このとき、図 2 のように関数呼び出しの前に宣言することができます。仮引数は省略または省略可能で、図 2 の a と b を省略して int Add(int,int); と記述することもできます。

 関数の定義:関数の定義は、関数の特定の実現を指し、関数の関数実現について説明します。

 注:関数の宣言は通常は使用されず、実際にコードを記述するときに使用されることはほとんどありません。関数が一つしかない場合、直前に定義することはできないのでしょうか?申告する必要はありません。企業では通常、追加モジュールを作成します。Add.c と Add.h を作成し、これら 2 つを組み合わせることを追加モジュールと呼びます。

 関数の定義をAdd.c(ソースファイル2)に記述し、関数の宣言をAdd.h(ヘッダファイル)に記述します。使用する場合は、ヘッダファイル #include "Add.h" を直接参照して、元のソースファイル内で使用してください。  

 関数定義コードを公開したくない場合は、Add.c を静的ライブラリにコンパイルできます。別のプロジェクトを開いて、Add.h と Add.c の 2 つのファイルを作成し、プロジェクト名をクリックし、プロパティを右クリックして、一般-構成タイプ-静的ライブラリ.lib-生成ソリューションを選択するだけです。その後、そのプロジェクト ファイルの Debug の下に Add.lib ファイルが生成されます。Add.lib ファイルを開くと理解できないバイナリ情報になります。このとき、Add.h ファイルと Add.lib ファイルは他の人でも使用でき、この 2 つのファイルをプロジェクト ファイルに追加することで他の人もこの機能を使用できるようになります。現時点では、宣言は公開されていますが、関数の実装は公開されていないことがわかります。これはライブラリ関数とよく似ています。 

 関数の再帰 (再帰と回帰)

プログラムが自分自身を呼び出すプログラミング手法は再帰と呼ばれます。

アルゴリズムとしての再帰は、プログラミング言語で広く使用されています。プロセスまたは関数には、その定義または説明で直接的または間接的に自分自身を呼び出すメソッドがあります。通常は、大きく複雑な問題を層ごとに、元の関数と同様の小さな問題に変換して解決します。再帰的戦略では、少数の関数のみが必要です。問題解決プロセスで必要となる複数の繰り返し計算をプログラムで記述することで、プログラム内のコード量が大幅に削減されます。

主な考え方は、「大きなものを小さくする」です。

各再帰は完全に独立した関数呼び出しです。

最も単純な再帰を考えてみましょう。

 これはエラー (スタック オーバーフロー) ですが、実際には関数の再帰です。

例: 整数値を受け入れ、その各ビットを順番に出力します。入力 1234、出力 1 2 3 4これは print() 関数の再帰です。n>9 が再帰的飛び出しの条件です。それ以外の場合は無線再帰が発生して戻れなくなります。

再帰に必要な 2 つの条件 (再帰コードがない場合は、それが間違っているはずです)

制約があり、この制約が満たされると再帰は続行されなくなります。

再帰呼び出しのたびに、この制限にどんどん近づいていきます。

例:

1. 文字列の長さを調べるための一時変数を作成できる関数を作成します。

 2. 文字列の長さを調べる関数を作成する場合、一時変数を作成することはできません。

 


再帰と反復

再帰は反復として記述される場合もあり、反復は再帰として記述される場合もあります。

1. n の階乗を求めます。

 2. n 番目のフィボナッチ数を見つけます。(オーバーフローは考慮していません)

フィボナッチ数列:最初の 2 つの数値の合計が 3 番目の数値に等しい。fib(n) = fib(n-1) + fib(n-2)

 2 番目のタイプの非再帰の方が効率的であることは明らかです。操作が減り、操作が高速化されます。

再帰を記述する場合、明らかな欠陥はありませんが、今回は再帰を使用して完了しますが、それ以外の場合は非再帰で完了する必要があります。

 ヒント:

多くの問題は再帰的形式で説明されますが、これは単に非再帰的形式よりも明確であるためです。

ただし、これらの問題の反復実装は、多くの場合、再帰的実装よりも効率的ですが、コードの可読性は低下します。

複雑な問題を反復によって実装できない場合、再帰的実装の単純さによって、それがもたらす実行オーバーヘッドを補うことができます。

関数再帰の典型的な例:

1. ハノイの塔問題。

2. カエルは階段を飛び降ります。n 段があり、カエルが一度に 1 段または 2 段ジャンプすると仮定します。可能性は合計で何回ありますか。

おすすめ

転載: blog.csdn.net/zxf123567/article/details/123435031