再帰処理で指定されたパターンを出力する方法(C言語)
ここでは、与えられたパターンを再帰的アプローチを用いて出力する方法について解説します。
再帰関数とは、自分自身を複数回呼び出す関数のことです。1つのプログラムの中に、いくつでも再帰関数を定義することができます。ただし、再帰関数を使う際の課題は、その計算の複雑さにあります。呼び出しが深くなりすぎるとパフォーマンスに影響を与えるため、終了条件を正しく設計することが重要です。
アルゴリズム
START
Step 1 -> 関数 int printpattern(int n)
もし n > 0 ならば
printpattern(n-1) を呼び出す
「*」を出力する
IF 終了
End
Step 2 -> 関数 int pattern(int n)
もし n > 0 ならば
pattern(n-1) を呼び出す
IF 終了
printpattern(n) を呼び出す
改行(\n)を出力する
End
STOPサンプルコード
#include <stdio.h>
int printpattern(int n) {
if(n>0) {
printpattern(n-1);
printf("*");
}
}
int pattern(int n) {
if(n>0) {
pattern(n-1); // パターンを再帰的に出力する
}
printpattern(n); // n を再帰的に減らしながら「*」を出力する
printf("\n"); // 改行のため
}
int main(int argc, char const *argv[]) {
int n = 7;
pattern(n);
return 0;
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
* ** *** **** ***** ****** *******
解説
このプログラムは2つの再帰関数で構成されています。pattern() 関数は自身を再帰的に呼び出して n を1ずつ減らし、各行の出力を制御します。一方、printpattern() 関数は各行に表示するアスタリスク(*)の個数を担当します。
n = 7 の場合、pattern(7) → pattern(6) → … → pattern(1) の順に呼び出しが積み重なり、戻る過程で printpattern(1)、printpattern(2)…と順番に実行されるため、1個から7個まで段階的に増えていく三角形のパターンが出力されます。
-
C++プログラムで指定サイズの最大合計を持つ正方形部分行列を出力する方法
N×N の行列が与えられたとき、M ≤ N かつ M ≥ 1 を満たすサイズ M×M の部分行列の中から、すべての要素の合計が最大となるものを見つけます。入力される行列には、0・正の整数・負の整数のいずれも含まれる可能性があります。 例 入力: {{1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}, {3, 3, 3, 3, 3}, {4, 4, 4, 4, 4}, &nbs
-
C++で行列の各列の0の個数に基づいて列をソートし、インデックスを出力する方法
N行M列のサイズを持つ行列が与えられたとき、各列に含まれる0の個数を数え、その個数に基づいて列をソートし、ソート後の列のインデックスを出力するのが課題です。 例えば、1列目に0が1つ含まれ、2列目には0がまったく含まれず、3列目に0が2つ含まれている場合、0の少ない順に並べると出力は「2 1 3」になります。 入力例と出力例 Input: 0 0 0 1 1 1 1 0 1 Output: 1 3 2 解説 上記の入力における各列の0の個数は次のとおり