関数
用途 : 処理をまとめる
- 宣言(プロトタイプ宣言)
戻り値の型 関数名(引数);
- 定義
戻り値の型 関数名 (引数)
{
処理
}
- 呼び出し
関数名(引数);
※引数がある場合、関数定義と一致する引数を渡してあげる
プログラミング言語が提供する関数群のことを標準ライブラリ関数という
引数
引数とは関数を実行する際に、関数に渡す値のこと。
引数は ,(カンマ)で区切っていくつでも作成可能。
関数の引数がない場合、型 関数名 (void) を推奨する。
※C#では、引数にvoidを入れる必要はない
-
仮引数
関数の宣言及び定義で使用される引数のこと -
実引数
関数の呼び出し時に使われる引数のこと
※実引数に指定した値をコピーして関数内で利用する
戻り値(返り値)
関数の処理が終わった結果を返すために、戻り値(返り値) が用いられる。
しかし、関数内で処理が完結する場合、関数の型をvoidにする必要がある。
int Plus(int a, int b)
{
// 足し算の結果を返す
return a + b;
}
void None(void)
{
// 戻り値必要なし
}
スコープ
{}の間をスコープ(変数や関数などが有効な範囲)
また、関数のスコープ内で宣言した変数をローカル変数
逆に、全てのスコープ外で宣言した変数をグローバル変数(非推奨)
ラムダ式(匿名関数)
C++11以上
用途 : C++の標準ライブラリ関数に用いられる
[値渡し、参照渡しする場所(キャプチャ)](引数) -> 戻り値の型 { 処理 }
※キャプチャした場合、関数 -> 関数オブジェクトに
- thisポインタのキャプチャ
値渡し : [=]
※C++20以上は、[=, this]が推奨となる
参照渡し : [&]
C#版
用途 : LINQ、イベントハンドラ
(引数) => { 処理 }
再帰関数
用途 : 木構造などの階層構造を持つデータやバックトラッキングの解決
ex)階乗やフィボナッチ数列、二分探索など
再帰関数とは、作成した関数の中で自分自身を呼び出す関数
例
#include <stdio.h>
/// <summary>
/// 階乗
/// </summary>
/// <param name="N">求める数</param>
/// <returns>1以下 : 終了、それ以外 : 続行</returns>
int Factorial(int N)
{
// 終了条件
if (N <= 1) return N;
// 続行
return N * Factorial(N - 1);
}
int main(void)
{
// 入力
int N = 0;
printf("整数値を入力してください\n");
scanf_s("%d", &N);
// 出力
printf("%dまでの階乗: %d\n", N, Factorial(N));
return 0;
}
#include<stdio.h>
/// <summary>
/// フィボナッチ数列
/// </summary>
/// <param name="N">求める数</param>
/// <returns>1以下 : 終了、それ以外 : 続行</returns>
int Fibonacci(int N)
{
// 終了条件
if (N <= 1) return N;
// 続行
return Fibonacci(N - 1) + Fibonacci(N - 2);
}
int main(void)
{
//フィボナッチ数の計算
int N = 数字;
printf("%dまでのフィボナッチ数は%d\n", N, Fibonacci(N));
return 0;
}
動的計画法
用途 : 計算の省略
動的計画法とは、問題を小さなもの(部分問題)に分割し、
再帰処理の中で同じ部分問題が出た場合、解を再利用する(メモ化)こと。
#include <stdio.h>
/// <summary>
/// フィボナッチ数列
/// </summary>
/// <param name="N">求める数</param>
/// <param name="memo">再利用する解</param>
/// <returns>1以下 : 終了、それ以外 : 続行</returns>
int Fibonacci(int N, int memo[])
{
// 終了条件
if (N <= 1) return N;
// 解の再利用
if (memo[N] != -1) return memo[N];
// 再利用可能にしてから続行
memo[N] = Fibonacci(N - 1, memo) + Fibonacci(N - 2, memo);
return memo[N];
}
int main(void)
{
// 初期化
int N = 10;
int memo[10 + 1];
for (int i = 0; i <= N; i++)
{
memo[i] = -1;
}
// 出力
printf("%dまでのフィボナッチ数は%d\n", N, Fibonacci(N, memo));
return 0;
}