首页 > 编程语言 >有趣的算法

有趣的算法

时间:2024-04-07 23:45:46浏览次数:21  
标签:移到 台阶 圆盘 --- 算法 return 有趣 Java

126094-zui-yi_shu-shou_shi-ji_qie-chuang_zao_xing_de_yi_shu-1920x1080

青蛙跳台问题

image-20240308161943909

现在一共有n个台阶,一只青蛙每次只能跳一阶或是两阶,那么一共有多少种跳到顶端的方案?

例如n=2,那么一共有两种方案,一次性跳两阶或是每次跳一阶。

现在请你设计一个Java程序,计算当台阶数为n的情况下,能够有多少种方案到达顶端。

解决方法

假设青蛙已经站在了顶端(n),那么它的前一个台阶是那个呢?要么是第n-1阶台阶,要么是第n-2阶台阶。

那么到达第n阶台阶所需的方案是不是就等于到达第n-1阶台阶的方案数加上到达第n-2阶台阶的方案数

即f(n) = f(n-1) + f(n-2)

Java实现代码

public static int steps(int n) {
    //判断0台阶的情况
    if (n == 0) {
        return 0;
    }
    //判断1阶台阶的情况
    if (n == 1) {
        return 1;
    }
    //判断2阶台阶的情况
    if (n == 2) {
        return 2;
    }
    //递归调用
    return steps(n-1) + steps(n-2);
}

汉诺塔问题

img

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始

按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

问题:这三根柱子我们就依次命名为A、B、C,现在请你设计一个Java程序,计算N阶(n片圆盘)汉诺塔移动操作的每一步。

解决方案

  • 只有一个圆盘的时候,可以直接把圆盘从A移到C(记作A--->C)

  • 当有两个圆盘时,必须要把第一个移到B(A--->B),再把第二个移到C(A--->C),最后再把第一个圆盘从B移到C(B--->C)

  • 当有三个圆盘时...

    一个圆盘一个圆盘的考虑太复杂,那么能不能只考虑只有两部分的情况(最后一个圆盘(记作@)和除它之外的所有圆盘(记作#)),也就是相当于第二种情况。先把#移动到B柱(中间过程先不考虑),再把@移动到C柱。

    把@移动到C柱之后,以后所有的操作都在与它无关(暂时认为没有它了),这时把B柱和A柱交换位置,那么情况是不是又回到了(最后一个圆盘(记作@)和除它之外的所有圆盘(记作#))这种情况,我们重复上面的步骤。没重复一次,就相当于从剩余需要移动的圆盘中挑出最大的扔掉,那么最后又回到了只有一个圆盘的情况,那这不就好办了吗,直接把最后一个扔过去

    Java实现代码

    //把n个圆盘从A移到C
    public static void tower(int n, String a, String b, String c) {
        //只有一个圆盘的情况
        if (n == 1) {
            System.out.println(a + "--->" + c);
        } else {
            //把n-1个圆盘丢到B柱上
            tower(n-1, a, c, b);
            //把剩下的移到C柱上
            System.out.println(a + "--->" + c);
            //对于现在B柱上的圆盘,先把A柱和B柱交换位置,
            //问题就变成了把n-1个圆盘从A移动到C
            tower(n-1, b, a, c);
        }
    
    }
    

标签:移到,台阶,圆盘,---,算法,return,有趣,Java
From: https://www.cnblogs.com/starychen/p/18120176

相关文章

  • 基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Alg
    前言协同过滤推荐系统,包括基于用户的、基于项目的息肉通过率等,今天我们读一篇基于项目的协同过滤算法的论文。今天读的论文为一篇名叫《基于项目的协同过滤推荐算法》(Item-BasedCollaborativeFilteringRecommendationAlgorithms)。摘要Recommendersystemsapplyknowledg......
  • [算法前沿]--022-使用 StarCoder 创建一个编程助手
    文章目录StarCoder调优测试StarCoderBigCode开发的StarCoder,这是一个在一万亿的token、80多种编程语言上训练过的16B参数量的模型。训练数据多来自GitHub上的issues、使用Git提交的代码、JupyterNotebook等等。得益于对企业友好的许可证、长度为8......
  • python排序算法
    冒泡排序n=int(input())#5a=list(map(int,input().split(",")))#7,6,5,4,3foriinrange(0,n-1):#循环n-1次forjinrange(0,n-i-1):#循环n-i次,依次找第二大,第三大的等等ifa[j]>a[j+1]:a[j],a[j+1]=a[j+1],a[j]......
  • 基于斑马算法优化的核极限学习机(KELM)回归预测
    基于斑马算法优化的核极限学习机(KELM)回归预测文章目录基于斑马算法优化的核极限学习机(KELM)回归预测1.KELM理论基础2.回归问题数据处理4.基于斑马算法优化的KELM5.测试结果6.Matlab代码摘要:本文利用斑马算法对核极限学习机(KELM)进行优化,并用于回归预测.1.KEL......
  • 树模型系列——2、决策树生成算法
    1ID3算法ID——IterativeDichotomiser(迭代二分器)从根结点(rootnode)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;在对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为......
  • Offer必备算法22_优先级队列_堆_四道力扣题详解(由易到难)
    目录①力扣1046.最后一块石头的重量解析代码②力扣703.数据流中的第K大元素解析代码③力扣692.前K个高频单词解析代码④力扣295.数据流的中位数解析代码本篇完。①力扣1046.最后一块石头的重量1046.最后一块石头的重量难度简单有一堆石头,每块石头的重......
  • 常见面试算法题-分苹果
    ■ 题目描述【分苹果】A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位12+5=9(1100+0101=9),B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。输入苹果的数量和每个苹果重量,输出满足A......
  • 贪心算法
    1、基本概念贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法解决问题的策略是:做出选择时,每次都选择对当前状态最优的解,而不考虑整个问题的解空间。它通常用来解决最优化问题,如最小生成树、哈夫曼编......
  • 调度算法
    调度算法评价指标CPU利用率由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可能多地工作CPU利用率:指CPU“忙碌”的时间占总时间的比例。Eg:某计算机只支持单道程序,某个作业刚开始需要在CPU上运行5秒,再用打印机打印输出5秒,之后再执行5秒,才能结束。在此过程中,CPU利用率、打......
  • 【算法】数论
    题目链接前言疑似是有点不会数学了,照着题解推式子都推了小半个下午,还看不出来减法公式,唉。题解考虑把这些\(f(a,b)\)异或起来再模一个数不会有很好的性质,所以要把每一个\(f(a,b)\)都算出来。由加法公式得\[f(a,b)=\sum\\tbinom{b}{i}\tbinom{n-i}{a}\]\[=\sum\tbin......