記事のディレクトリ
1網羅アルゴリズム
徹底的なアルゴリズム(徹底的な攻撃方法は)最も単純なアルゴリズムである。それは、強力なコンピュータに依存して
問題を解決する目的を達成するために、あらゆる可能な状況を説明するための計算能力。徹底的なアルゴリズムの効率は明らかに従うべき規則いくつかの行事のために適して高くはないが、しかし、ではありません。
- アルゴリズム網羅の基本的な考え方は
、アルゴリズムの徹底的な基本的な考え方は、以下のステップを実行し、すべての可能なケースから正しい答えを検索することです。
- 可能な場合のために、結果が計算されます。
- 彼らは要件を満たしている場合は、正しい答えを見つけるために、ではない。ステップ1の下に実行される可能性の高いシナリオを検索する場合の結果は、要件を満たしているかどうかを確認します。
それは指定された範囲内で答えを探すことができるように、スコープの質問に対する明確な答えを取る徹底的なアルゴリズムを使用する場合。指定した範囲、およびループの後の候補解答の正しさを検証するために、徐々に条件文に使用することができ、正しい答えを与えるために
import java.util.Scanner;
// 穷举法求解鸡兔同笼问题
public class ChickenAndRabbit {
static int chicken, rabbit;
public static boolean methodOfExhaustion(int head, int foot) {
boolean result = false;
int i, j;
for (i = 0; i <= head; i++) {
j = head - i;
if (i * 2 + j * 4 == foot) {
result = true;
chicken = i;
rabbit = j;
}
}
return result;
}
public static void main(String[] args) {
System.out.println("穷举法求解鸡兔同笼问题...");
System.out.print("请输入头数:");
Scanner input = new Scanner(System.in);
int head = input.nextInt();
System.out.print("请输入脚数:");
int foot = input.nextInt();
if (methodOfExhaustion(head, foot))
System.out.println("鸡 " + chicken + " 只,兔 " + rabbit + " 只。");
else
System.out.println("无解。");
}
}
2再帰アルゴリズム
再帰的なアルゴリズムは、一般的な思考アルゴリズムに使用され、それが広く、数学的計算でなどで使用されています。法律のための明確な公式がある再帰的アルゴリズム。
- 再帰アルゴリズムの基本的な考え方
再帰的アルゴリズムは、既存のデータとの関係、そして徐々に導出の結果に基づいて得られる、思考のモードが合理的である表します。次のように再帰的アルゴリズムの実装プロセスは、次のとおりです。
- 知られている結果との関係は、中間結果を解決します。
- 要件かどうかを判断し、満たされていない場合は、既知の結果との関係に基づいて、中間結果を解決していきます。彼らは要件を満たしている場合は、正しい答えを見つけるために。
再帰的アルゴリズムは、多くの場合、答えと質問の間の論理的な関係を知ることが必要です。明示的な計算式が続くことができると多くの数学の問題で、それは再帰的なアルゴリズムを使用して、しばしば可能です。
import java.util.Scanner;
public class RabbitLitter {
static int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
public static void main(String[] args) {
System.out.println("递推算法求解兔子产仔...");
System.out.print("请输入时间:");
Scanner scanner = new Scanner(System.in);
int month = scanner.nextInt();
System.out.printf("经过 %d 月,共能繁殖 %d 对兔子\n", month, fibonacci(month));
}
}
递推算法求解兔子产仔...
请输入时间:12
经过 12 月,共能繁殖 144 对兔子
Process finished with exit code 0
3再帰アルゴリズム
import java.util.Scanner;
public class RecursiveAlgorithm {
static long fact(int n) {
if (n <= 1)
return 1;
else
return n * fact(n - 1);
}
public static void main(String[] args) {
System.out.println("递归算法求解阶乘...");
System.out.print("请输入一个整数:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.printf("%d 的阶乘为 %d.\n", n, fact(n));
}
}
递归算法求解阶乘...
请输入一个整数:12
12 的阶乘为 479001600.
Process finished with exit code 0
4分割統治アルゴリズム
import java.util.Scanner;
public class DivideAndConquerAlgorithm {
static final int MAXCOINNUM = 30;
static int falseCoin(int[] coin, int low, int high) {
int sum1, sum2;
sum1 = sum2 = 0;
// 递归出口
if (low + 1 == high) {
if (coin[low] < coin[high]) {
return low + 1;// 硬币序号比下标大 1
} else {
return high + 1;
}
}
// 分解问题
if ((high - low + 1) % 2 == 0) {// 当硬币个数为偶数
for (int j = low; j <= low + (high - low) / 2; j++) {
sum1 += coin[j]; // 前一半硬币的重量
}
for (int j = low + (high - low) / 2 + 1; j <= high; j++) {
sum2 += coin[j]; // 后一半硬币的重量
}
if (sum1 > sum2) // 假币在后一半中,在后一半中继续查找
return falseCoin(coin, low + (high - low) / 2 + 1, high);
else // 假币在前一半中,在前一半中继续查找
return falseCoin(coin, low, low + (high - low) / 2);
} else { // 当硬币个数为奇数
for (int j = low; j <= low + (high - low) / 2 - 1; j++) {
sum1 += coin[j]; // 前一半硬币的重量
}
for (int j = low + (high - low) / 2 + 1; j <= high; j++) {
sum2 += coin[j]; // 后一半硬币的重量
}
if (sum1 > sum2) { // 假币在后一半中,在后一半中继续查找
return falseCoin(coin, low + (high - low) / 2 + 1, high);
} else if (sum1 < sum2) { // 假币在前一半中,在前一半中继续查找
return falseCoin(coin, low, low + (high - low) / 2 - 1);
} else { // 假币为中间那个硬币
return low + (high - low) / 2 + 1;
}
}
}
public static void main(String[] args) {
System.out.println("分治算法求假币问题...");
int[] coin = new int[MAXCOINNUM];
System.out.print("请输入硬币总个数:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println("请逐个输入硬币重量(只能有一枚假币)...");
for (int i = 0; i < n; i++) {
coin[i] = scanner.nextInt();
}
System.out.printf("%d 个硬币中,第 %d 个硬币为假币。\n", n, falseCoin(coin, 0, n - 1));
}
}
分治算法求假币问题...
请输入硬币总个数:13
请逐个输入硬币重量(只能有一枚假币)...
1 5 5 5 5 5 5 5 5 5 5 5 5
13 个硬币中,第 1 个硬币为假币。
Process finished with exit code 0
5個の確率的アルゴリズム
import java.util.Scanner;
public class ProbabilityAlgorithm {
static double MonteCarloPI(int n) {
double PI, x, y;
int sum = 0;
for (int i = 0; i < n; i++) {
x = Math.random(); // 产生 0~1 之间的一个随机数
y = Math.random();
// 点落在阴影区域
if (x * x + y * y <= 1)
sum++;
}
// π = 4 * 概率
PI = 4.0 * sum / n;
return PI;
}
public static void main(String[] args) {
System.out.println("蒙特卡罗算法求 π ...");
Scanner scanner = new Scanner(System.in);
System.out.print("请输入点的数量(数量越大,π 的值越精确):");
int n = scanner.nextInt();
double PI = MonteCarloPI(n);
System.out.println("π = " + PI);
}
}
蒙特卡罗算法求 π ...
请输入点的数量(数量越大,π 的值越精确):100000000
π = 3.14146396
Process finished with exit code 0