基本算法思想

穷举算法:从所有可能情况中搜索正确答案,效率并不高,适用于没有明显规律可循的场合。
执行步骤:
(1)确定所有可能结果范围
(2)对于一种可能的结果,计算其结果
(3)判断结果是否满足要求,不满足搜索下一个可能结果,满足则表示寻找到一个正确答案
例子:鸡兔同笼问题

public class P3_1 {
    static int chicken,rabbit;
    public static int qiongJu(int head,int foot){
        int i,j,re;
        re=0;
        for( i=0;i<=head;i++){
            j=head-i;
            if(i*2+j*4==foot){
                re=1;
                chicken=i;
                rabbit=j;
            }
        }
        return re;
    }
     public static void main(String[] args){
        int re,head,foot;
        System.out.print("输入头的数量");
        Scanner input=new Scanner(System.in);
        head=input.nextInt();
        System.out.print("输入脚的数量");
        foot=input.nextInt();
        re=qiongJu(head,foot);
        if(re==1){
            System.out.println(chicken+","+rabbit); 
        }else{
            System.out.println("无解");
        }

    }

}

递推算法:根据已有的数据和关系,逐步推导而得的结果,一般有明确的公式可循
执行步骤:
(1)根据已知结果求解中间结果
(2)判断结果是否达到要求,如果没有,继续根据已知结果和关系求解中间结果,如果满足则寻找到正确答案
例子:斐波那契数列

public class P3_2 {
    public static int fibonacci(int n){
        int t1,t2;
        if(n==1||n==2){
            return 1;
        }
        else{
            t1=fibonacci(n-1);
            t2=fibonacci(n-2);
            return t1+t2;
        }
    }
    public static void main(String[] args){
        System.out.print("请先输入时间");
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        int number=fibonacci(n);
        System.out.println("经过"+n+"月时间,共繁殖成"+number+"对兔子");
    }
}

递归算法:在程序中不断反复调用自身。待解决的问题能够分解为相同问题的一个子问题,必须使用if语句判断递归结束的条件。
直接递归:在方法中调用方法本身
间接递归:方法a调用方法b,方法b又调用方法a
好处:代码简洁清晰,可读性好
缺点:没有明显地减少代码规模和节省内存空间
例子:求阶乘

public class P3_3 {
    static long fact(int n){
        if(n<=1){
            return 1;
        }
        else{
            return n*fact(n-1);
        }
    }
    public static void main(String[] args){
        int i;
        System.out.print("请输入要求阶乘的一个整数:");
        Scanner input=new Scanner(System.in);
        i=input.nextInt();
        System.out.print(i+"的阶乘结果为:"+fact(i));
    }
}

分治算法:将一个计算复杂的问题分为规模较小,计算简单的小问题求解,然后综合各个小问题,求解问题的最终答案。
步骤:
(1)对于一个规模为N的问题,若该问题容易解决则直接解决
(2)否则将分解为M个规模较小的子问题,这些子问题相互独立,并且与原问题形式相同
(3)递归解决子问题
(4)合并子问题的解
例子:寻找假币,30个硬币,一枚假币,假币比真币轻一点,如何区分假币
分析:初始化,为每个硬币编号,将硬币分为两堆,放在天平的两端;假币在较轻的一堆;再将较轻的一堆分为两堆,重复上述做法;直到剩下两枚硬币

public class P3_4 {
    static final int MAXNUM=10;
    static int FalseCoin(int coin[],int low,int high)
    {
        int i,sum1,sum2,sum3;
        int re=0;
        sum1=sum2=sum3=0;
        if(low+1==high)
        {
            //索引是从0到n-1
            if(coin[low]<coin[high]){
                re=low+1;
                return re;
            }else{
                re=high+1;
                return re;
            }
        }
        if((high-low+1)%2==0){//n为偶数
            for(i=low;i<=low+(high-low)/2;i++){
                sum1=sum1+coin[i];
            }
            for(i=low+(high-low)/2+1;i<=high;i++){
                sum2=sum2+coin[i];
            }
            if(sum1>sum2){
                re=FalseCoin(coin,low+(high-low)/2+1,high);
                return re;
            }else if(sum1<sum2){
                re=FalseCoin(coin,low,low+(high-low)/2);
                return re;

            }
            else{

            }

        }
        else{
            //n为奇数
            for(i=low;i<low+(high-low)/2-1;i++){
                sum1=sum1+coin[i];
            }
            for(i=low+(high-low)/2+1;i<=high;i++){
                sum2=sum2+coin[i];
            }
            sum3=sum3+coin[low+(high-low)/2];
            if(sum1>sum2){
                re=FalseCoin(coin,low+(high-low)/2+1,high);
                return re;
            }else if(sum1<sum2){
                re=FalseCoin(coin,low,low+(high-low)/2-1);
                return re;
            }else{

            }
            if(sum1+sum3==sum2+sum3){
                re=low+(high-low)/2+1;
                return re;
            }
        }
        return re;
    }

    public static void main(String[] args){
        int[] coin=new int[MAXNUM];
        int i,n;
        int weizhi;
        System.out.print("请输入银币总的个数:");
        Scanner input=new Scanner(System.in);
        n=input.nextInt();
        System.out.print("请输入银币的真假:");
        for(i=0;i<n;i++){
            coin[i]=input.nextInt();
        }
        weizhi=FalseCoin(coin,0,n-1);
        System.out.println("第"+weizhi+"个银币是假的");

    }

}
### 回答1: 算法设计这门课程旨在帮助学生学习如何设计和分析计算机程序来解决各种问题。在这门课中,学生将学习抽象思维的概念,并学习如何使用算法来有效地解决问题。算法是解决计算问题的步骤的有序集合,并且可以用不同的方法来实现。学生还将学习如何分析算法的时间复杂度和空间复杂度,以了解算法的效率。 在这门课程中,学生将学习计算思维的概念,即思考问题时应用计算机科学的方法。这包括学习如何使用数据结构和算法来解决问题,以及如何使用逻辑和证明来思考问题。算法设计这门课程还将涵盖计算机科学的其他相关主题,如算法的分类、贪心算法、分治算法、动态规划等。 总的来说,算法设计这门课程的基本算法思想是通过学习和应用抽象思维和计算思维来解决计算机科学中的问题,并学习如何使用各种不同的算法来解决这些问题。 ### 回答2: 算法设计是一门旨在培养学生算法设计与分析能力的课程,其基本算法思想包括了分治法、贪心法、动态规划和回溯法等。 首先,分治法是将一个大问题分解为若干个小问题,通过解决小问题最后合并得到答案。贪心法则是每一步都选择当前情况下最优的解,以期望最终获得全局最优解。动态规划则通过分阶段的决策来求解问题,每个阶段决策是依赖于前一个阶段的决策,最终达到求解整个问题的目的。回溯法则是通过回溯的思想,在问题的解空间中进行遍历,以寻找问题的解。 这些算法思想相互联系紧密。例如,分治法和动态规划都利用到了问题的分解和合并思想,只是在递归的过程中做了不同的决策;贪心法也可以看作是一种特殊的动态规划,每一步只考虑当前最优解而不进行回溯;回溯法则可以结合动态规划进行剪枝优化,减少不必要的遍历。 这门课程还包含了计算思维的内容。计算思维是指解决问题的思维方式和方法,其核心是将问题抽象为数学或计算机可处理的形式,并运用数学与逻辑推理的方法进行求解。在算法设计的过程中,学习者需要通过分析问题,把问题抽象为数据结构和算法模型,从而设计出高效的算法实现。同时,算法设计也锻炼了学生的逻辑思维、抽象思维和问题解决能力,培养了他们对计算机科学的思维方式和认识。 总之,算法设计这门课程的基本算法思想相互联系紧密,通过学习这些思想和运用计算思维,学生能够掌握常用的算法设计方法和技巧,并培养了对计算机科学的思维方式和分析问题的能力。 ### 回答3: 算法设计是计算机科学中的基础课程之一,主要研究解决问题的有效方法与策略。它的基本算法思想包括分治法、贪心法、动态规划和回溯法等。 分治法是将问题划分为若干子问题,分别求解后再将结果合并,最终得到整个问题的解。贪心法则是根据每一步的局部最优选择来构建整体最优解,不再回头检查前面所做的选择。动态规划则将问题划分为一系列相互依赖的子问题,并通过记忆已解决的子问题来减少计算量,最终得到整体最优解。回溯法则是通过穷举所有可能的解空间,逐步得到问题的解。这些基本算法思想分别适用于不同类型的问题,有助于提高问题求解的效率和准确性。 这些算法思想相互联系紧密,相互借鉴。例如,在使用分治法求解问题时,往往会应用动态规划来减少子问题的重复计算;在使用贪心法时,可能需要考虑使用回溯法对局部最优解进行验证。算法设计是一门综合性较强的课程,要求学生掌握多种算法思想,并能结合具体问题选择合适的算法,以达到高效求解问题的目的。 算法设计课程涉及的计算思维包括问题建模、抽象与模式识别、创新思维等。学习算法设计需要学生具备将实际问题抽象为计算问题的能力,通过对问题的建模和创新思维,提出寻求解决问题的算法。此外,还需要学生对算法的复杂度和效率有深入的了解与分析,以便判断算法是否符合实际需求。通过算法设计课程的学习,可以培养学生的逻辑思维与创新能力,提高解决实际问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值