C言語再帰、IO


再帰の本質:大タスクを処理ロジックが完全に同じサブタスクに分解し、処理範囲を終了するまで縮小し続ける.すなわち,再帰関数は自身を呼び出し,より小さなサブタスクを完了する.なお,再帰には,再解体できないサブタスクを処理した後に停止する明確な終了条件も必要である.
再帰的なプログラムを使用できるのは一般的にループを使用することで解決できるが、適切な場合に再帰的により読みやすさが向上するが、パフォーマンスオーバーヘッドの増大(再帰的には大量の関数呼び出しが必要)を招く可能性があるため、誰が誰に代わることができるのかではなく、適切なタイミングで適切な方法を選択して処理することができ、豊富なプログラミング経験が必要になる.
再帰的な典型的な運用シーン:
ハンノタワー、二分検索など.
本の上でフィポラの数の列を切って例を挙げて、しかし個人はフィポラの数の列が再帰で実現するのが簡単で簡単だと感じて、しかし繰り返し行う仕事は多すぎて、1つの良いアルゴリズムではありません
F(n) = F(n-1) + F(n-2); F(1)=F(0) = 1;
再帰的に処理できることは明らかです.△しかし、計算F(i)を複数回繰り返しているものがたくさんあるかどうか考えてみてください.
 
C言語のI/O
I/Oは計算機の非常に重要な構成部分であり、多くの現代プログラミング言語と同様に、C言語自体は入出力操作をサポートしていない.この部分の処理は標準ライブラリ関数で提供されている.
I/Oフロー:
概念的には、すべての文字ベースの入出力操作は「ストリーム」方式であり、1つの文字を入力し、ストリームの末尾に追加し、ストリームのヘッダからデータを取得する.(FIFO)
C言語の標準入出力ストリームは、それぞれstdin(入力)、stdout(出力)
putcharとgetchar:
1文字(文字に対応するASCIIコード値)、putchar出力、getchar入力のみを処理する.
フォーマットI/O
各種データ型printfとscanfをサポート
printfの機能はフォーマットされたテキストを出力ストリームに出力することであり,この関数によりプログラムで生成された各種デジタルをASCIIテキストに埋め込み,出力を混合印刷することができる.したがってprintfは、様々なタイプをASCIIコードに変換する能力を備えなければならない.
関数プロトタイプ
int printf ( const char * format, ... );
int scanf( const char * format, ... ); //         

formatはフォーマット列に出力するテキストと「変換仕様」が含まれており、その後は不定長のパラメータリスト(フォーマットが必要な値がいくつかありますが、ここにはいくつかのパラメータがあります)
format形式は概ね「output%d,%c,%s」(記号%を接頭辞とし、後続の文字は変換されたデータ型を表し、これが「変換仕様」である)であり、具体的な異なる文字が表すタイプはここでは詳細には述べない.
scanfはprintfと同じフォーマット列および変換仕様の定義を採用する.違いは、scanfの後続パラメータはポインタでなければなりません(変数に値を割り当てるため、変数のメモリアドレスをscanfに伝える必要があります).
 
ファイルI/O
fprintfとfcanfはprintfとscanfの共通バージョンであり、関連するファイルは呼び出し者によって表示されます(printfとscanfは2つの特殊なファイルstdinとstdoutで操作されます).
int fprintf(FILE *stream, const char *format, ...)
int fscanf(FILE *stream, const char *format,...); //         

printf、scanfとは異なり、FILEを指定して操作するファイルを表示する必要があります.