アルゴリズムとプログラミング
次の疑似コードを実行した後、変数 a と b の値として正しいものはどれか。 ``` function swap_by_value(x, y): // 値渡し temp = x x = y y = temp function swap_by_ref(ref x, ref y): // 参照渡し temp = x x = y y = temp a = 1 b = 2 swap_by_ref(a, b) // 参照渡しで呼び出す // この時点での a, b は? ```
ア.a=1, b=2(変わらない)
イ.a=1, b=1
ウ.a=2, b=2
エ.a=2, b=1(入れ替わる)正解
解説
参照渡しは「地図を手渡す」方式。コピーではなく「本物の場所(アドレス)」を教えるため、関数の中で値を変えると元の変数も変わる。swap_by_ref では a と b の実体を直接入れ替えるので、呼び出し元の a と b も入れ替わる。
なぜ エ が正解か
参照渡し(call by reference)では、引数 a と b の実体(メモリ上のアドレス)が x と y に渡される。関数内で x と y を交換すると、それは呼び出し元の a と b そのものを操作することになる。したがって swap_by_ref(a, b) を呼んだ後、a=2, b=1 に入れ替わる。一方、値渡し(swap_by_value)で呼んだ場合はコピーが渡されるため a=1, b=2 のまま変わらない。この違いが値渡しと参照渡しの本質的な差。
出典: AI生成問題(学習用)
← 前の問題
次の疑似コードを実行したとき、最後に出力される値はどれか。 ``` var x = 10 function foo(): var x = 20 bar() print(x) function bar(): x = 30 foo() ``` ここで、`bar()` 内の `x = 30` はグローバル変数 `x` を変更し、`foo()` 内の `var x` はローカルスコープを生成するものとする。
次の問題 →
次の再帰関数 f(n) を f(4) として呼び出したとき、返り値はどれか。 ``` function f(n): if n <= 1: return 1 return n * f(n - 1) ```