階乗

nから1までの全ての整数を掛け合わせた値(n!)を求めます。
再帰: `n * Factorial(n - 1)` という形で、より小さな問題として自身を呼び出すことで解を導きます。
ループ: 1からnまで順番に値を掛け合わせていくことで解を導きます。


Function Factorial(n)
  If n <= 1 Then
    Return 1
  Else
    Return n * Factorial(n - 1)
  EndIf
EndFunction
                        

Function FactorialLoop(n)
  result ← 1
  For i from 1 to n Do
    result ← result * i
  EndFor
  Return result
EndFunction
                        

コールスタック:

現在の計算:

最終結果:

フィボナッチ数列

「前の2つの項の和が次の項になる」というルールを持つ数列です。
再帰: `Fib(n-1) + Fib(n-2)` のように自身を2回呼び出します。重複計算を避ける「メモ化」を併用すると効率的です。
ループ: 2つの変数を使い、値を更新しながら順番に計算していきます。


Function Fibonacci(n)
  If n = 0 Then Return 0
  ElseIf n = 1 Then Return 1
  Else
    Return Fibonacci(n - 1) + Fibonacci(n - 2)
  EndIf
EndFunction
                        

Function FibonacciLoop(n)
  If n <= 1 Then Return n

  a ← 0, b ← 1
  For i from 2 to n Do
    temp ← a + b
    a ← b
    b ← temp
  EndFor
  Return b
EndFunction
                        

コールスタック:

計算過程:

数列 (0〜n番目):

最大公約数 (ユークリッドの互除法)

2つの数の「共通の約数」のうち最も大きいものを求めます。ユークリッドの互除法に基づいています。
再帰: `GCD(b, a mod b)` のように、引数を更新して自身を呼び出します。
ループ: `b`が0になるまで、値を更新し続けることで解を求めます。


Function GCD(a, b)
  If b = 0 Then
    Return a
  Else
    Return GCD(b, a mod b)
  EndIf
EndFunction
                        

Function GCDLoop(a, b)
  While b ≠ 0 Do
    temp ← b
    b ← a mod b
    a ← temp
  EndWhile
  Return a
EndFunction
                        

コールスタック:

引数の値:

最終結果:

ハノイの塔

再帰アルゴリズムの代表例。「n個の円盤をAからCへ移動する」問題を、(1) n-1個の円盤をAからBへ移動、(2) 1個の円盤をAからCへ移動、(3) n-1個の円盤をBからCへ移動、という3つのより小さな問題に分解して解いていきます。


Procedure Hanoi(n, from, to, work)
  If n = 1 Then
    出力(from & " → " & to)
  Else
    Hanoi(n - 1, from, work, to)
    出力(from & " → " & to)
    Hanoi(n - 1, work, to, from)
  EndIf
EndProcedure
                        

迷路探索

深さ優先探索(DFS): 一つの道を突き当たるまで深く進み、行き止まりになったら前の分岐点に戻って別の道を探す方法です。再帰で自然に実装できます。
幅優先探索(BFS): 現在地から近い順に、波が広がるように全方向を均等に探索する方法です。最短経路の発見を保証します。データ構造はキューを使います。


Procedure DFS(x, y)
  If (x, y) がゴール地点なら
    出力("ゴールに到達")
    終了

  visited[x][y] ← true

  For 各方向 (dx, dy) in [(1,0), (0,1), (-1,0), (0,-1)] Do
    nx ← x + dx
    ny ← y + dy

    If 迷路[nx][ny] が通路 And visited[nx][ny] = false Then
      DFS(nx, ny)
    EndIf
  EndFor
EndProcedure
                        

Procedure BFS(sx, sy)
  Q ← 空のキューを作成
  Enqueue(Q, (sx, sy))
  visited[sx][sy] ← true

  While Q が空でない間
    (x, y) ← Dequeue(Q)

    If (x, y) がゴール地点なら
      出力("ゴールに到達")
      終了

    For 各方向 (dx, dy) in [(1,0), (0,1), (-1,0), (0,-1)] Do
      nx ← x + dx
      ny ← y + dy

      If 迷路[nx][ny] が通路 And visited[nx][ny] = false Then
        visited[nx][ny] ← true
        Enqueue(Q, (nx, ny))
      EndIf
    EndFor
  EndWhile
EndProcedure