再帰を使用してN個の数値の合計を求めるJavaプログラム
本記事では、再帰(リカージョン)を使ってN個の数値の合計を求める方法について解説します。再帰関数とは、特定の条件(ベースケース)が満たされるまで、自分自身を何度も呼び出す関数のことです。
再帰とは、自己相似的な形式で処理を繰り返す手法です。プログラミング言語において、ある関数の内部から同じ関数自身を呼び出すことができる場合、その呼び出しを「再帰呼び出し」と呼びます。
多くのプログラミング言語では、スタックを用いて再帰を実装しています。一般に、ある関数(呼び出し元)が別の関数(呼び出し先)や自分自身を呼び出すと、実行の制御は呼び出し元から呼び出し先へ移ります。このとき、呼び出し元から呼び出し先へデータが渡されることもあります。
再帰を正しく動作させるためのポイント
再帰関数には、再帰を終了させるための「ベースケース」が必須です。ベースケースが存在しない、あるいは到達できない場合、関数は無限に呼び出され続け、最終的に StackOverflowError が発生します。
以下に具体的な入出力例を示します。
入力
入力値が次のとおりであるとします。
Enter the value of N : 6 Enter the elements of array : 15 30 45 80 100 140
出力
期待される出力は次のとおりです。
The total of N numbers is : 410
アルゴリズム
ステップ1 - 処理を開始する ステップ2 - 整数型の変数 N、my_sum、i および整数配列 my_array を宣言する ステップ3 - ユーザーから必要な値を読み込む、または値を直接定義する ステップ4 - 2つの整数を引数に取る再帰関数 RecursiveSum を定義する。この関数は、ベースケースに到達するまで自分自身を繰り返し呼び出しながら合計を計算する ステップ5 - 再帰関数 RecursiveSum を呼び出し、その結果を変数に格納する ステップ6 - 結果を表示する ステップ7 - 処理を終了する
例1:ユーザーからの入力を受け付ける場合
ここでは、プロンプトに対してユーザーが値を入力する方式を紹介します。
import java.util.Scanner;
public class ArraySum {
public static int RecursiveSum(int my_array[], int i, int N){
if (i == N)
return 0;
return my_array[i] + RecursiveSum(my_array, i + 1, N);
}
public static void main(String[] args){
int N, my_sum, i;
N = 6;
my_sum = 0;
System.out.println("Required packages have been imported");
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined ");
System.out.print("Enter the value of N : ");
N = my_scanner.nextInt();
int my_array[] = new int[N];
System.out.println("Enter the elements of the array :");
for ( i = 0 ; i < N ; i++ ){
my_array[i] = my_scanner.nextInt();
}
my_sum = RecursiveSum(my_array, 0, N);
System.out.println("\n The total of N numbers is : " + my_sum);
}
}
実行結果
Required packages have been imported A reader object has been defined Enter the value of N : 6 Enter the elements of the array : 15 30 45 80 100 140 The total of N numbers is : 410
例2:値を事前に定義しておく場合
ここでは、配列の要素があらかじめ定義されており、その内容をコンソールに表示した上で、再帰によって合計を計算します。
public class Main {
public static int RecursiveSum(int[] my_array, int i, int N){
if (i == N)
return 0;
return my_array[i] + RecursiveSum(my_array, i + 1, N);
}
public static void main(String[] args) {
int[] my_array = {15, 20, 25, 30, 35, 40};
int N = my_array.length;
System.out.println("The elements of the integer array are defined as :");
for (int i = 0 ; i < N ; i++ ){
System.out.print(my_array[i] + " ");
}
int my_sum = RecursiveSum(my_array, 0, N);
System.out.println("\nThe total of N numbers is : " + my_sum);
}
}
実行結果
The elements of the integer array are defined as : 15 20 25 30 35 40 The total of N numbers is : 165
-
Cプログラムで整数と浮動小数点数の合計を求める方法
この記事では、整数型の2つの数値 a、b と、浮動小数点型の2つの数値 c、d が与えられたとき、それぞれの合計を求めるCプログラムの書き方を解説します。具体的には、「a と b の合計」「c と d の合計」に加えて、「a と c の合計」も計算します。データ型が異なる数値を足し合わせる場合、printf関数の書式指定子を正しく選ぶことが重要で、指定の仕方によって出力結果が変わります。例として、a = 5、b = 58、c = 6.32、d = 8.64 が入力された場合、出力は次のようになります。a + b = 63c + d = 14.960001a + c = 11.320000解き方
-
【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法
問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を