1、穷举算法思想
在使用穷举法首先要明确问题的答案范围,然后在可能范围内列举出所有可能结果进行验证,最终得到符合条件的结果。
算法实例:鸡兔同笼问题,鸡兔同笼。有100个头,300个脚,请问分别有多少鸡和兔。
分析:鸡可能的范围是0-100只,我们就在0-100直接搜索结果。
public static void main(String[] args) {
int heads = 100;
int legs = 300;
//鸡的只数0-100直接循环
for(int i =0; i <= heads; i++) {
//验证脚的个数,符合条件返回
if(i*2+(heads-i)*4 ==legs) {
System.out.println("鸡: "+i+" 兔子: "+(heads-i));
break;
}
}
}
2、递推算法思想
递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。
顺推法
所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。
如斐波拉契数列,设它的函数为f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。则我们通过顺推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我们要求的解。
public static void main(String args[]) {
System.out.println(Fibonacci(5));
}
//求斐波拉契数列第n个数
public static int Fibonacci(int n) {
if(n <= 2) {
return 1 ;
}else {
int a = Fibonacci(n - 2);
int b = Fibonacci(n - 1);
return a+b;
}
}
逆推法
所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。
小龙的父亲供小龙4年(48个月)大学读书,采用整存零取的方式,一次性预存一笔钱于银行,小龙每个月月初取1000元。假设银行年利率为0.0171,若要求在第48个月小龙大学毕业时连本带息要取1000元,则应该一次性预存多少钱?
设每个月月末存款为clip_image002[1],其中clip_image011表示月份,n=0时表示第一月的月初,数学模型为:
f(n-1)=(f(n)/(1+rate))+1000
0<=n<=48
可以通过循环递推:
public static void main(String args[]) {
double monthRate = 0.0171 / 12;
int months = 49;
int FETCH = 1000;
double[] money = new double[months];
money[48] = FETCH;
for (int i = months-1; i > 0; i--){
money[i - 1] = money[i] / (1 + monthRate) + FETCH;
}
System.out.println(money[0]);
}
也可以使用递归思想:
public static void main(String args[]) {
//48个月后还能取出1000块
System.out.println(getMoney(48, 1000));
}
public static double getMoney(int i,double money){
//48个月前存款情况,就是我们要的开始存入的钱数
if(i==0){
return money;
}else{
double monthRate = 0.0171 / 12;
int FETCH = 1000;
//计算出上个月应有的存款数
money = money / (1 + monthRate) + FETCH;
i--;
//进行递归调用
return getMoney(i, money);
}
}
3、递归算法思想
递归(Recursion)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。 递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。
编写代码时一定要有结束条件,并且递归调用的结果一定要返回,这是比较常见的错误。
public static void main(String args[]) {
System.out.println(factorial(5));
}
//求n!
public static int factorial(int n) {
if(n <= 2) {
return n;
}else{
return n*factorial(n-1);
}
}
4、分治算法思想
这篇博客做了详细介绍:https://blog.csdn.net/qq_36154832/article/details/88422330
5、概率算法思想
基本算法思想
概率算法执行的基本过程如下:
(1)将问题转化为相应的几何图形S, S 的面积是容易计算的,问题的结果往往对应几何图形中某一部分S1 的面积。
(2)然后,向几何图形中随机撒点。
(3)统计几何图形S 和 S1 中的点数。根 据 S 的面积和S1 面积的关系以及各图形中的点数来计算得到结果。
(4) 判断上述结果是否在需要的精度之内,如果未达到精度则执行步骤(2)。如果达到精度,则输出近似结果。
概率算法大致分为如下4 种形式。
• 数值概率算法。
• 蒙特卡罗 (MonteCarlo)算法。
• 拉斯维加斯 (Las Vegas)算法。
• 舍伍德 (Sherwood)算法。
经典实例蒙特卡罗π算法思想:
首先圆的面积:S=π*r²
图中圆的半径是1,则阴影部分的面积为S=π/4
正方形的面积S=1
如果均匀的在正方形中撒点,落入阴影部分的概率为π/4
根据概率统计的规律,只要点足够多就可以得到非常近似的结果
public static double getPI(int n){
double x,y;
int sum = 0;
for(int i = 0;i<n;i++){
x = Math.random();
y = Math.random();
if(x*x+y*y<=1){
sum++;
}
}
return sum*4.0/n;
}
public static void main(String[] args) {
System.out.println(getPI(99999999));
}