Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 568|回复: 0

[算法学习]学习常用算法之(4)递推法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-26 00:06:08 | 显示全部楼层 |阅读模式
    算法是一组(有限个)规则,它为某个特定问题提供了解决问题的运算序列;也就是计算机解题的过程,在这个过程中,无论是形成解题思路还是编写程序, 都是在实施某种算法;前者是推理实现的算法,后者是操作实现的算法。

    计算机解题的核心是算法没汁。一个算法应该具有以下五个重要特征:
    (1)有穷性:一个算法必须保证执行有限步之后结束;

    (2)确切性:算法的每一步骤必须确切定义;

    (3)输入:一个算法有0个或多个输入,所谓0个输入是指算法本身定出初始条件;

    (4)输出: 一个算法有一个或多个输出,以反映对输人数据加工后的结果,没有输出的算法是毫无意义的;

    (5)能行性:算法原则上能够精确地运行,做有限次即可完成。
       
      
       
       
         
       

         
       
      
       递推法:递推法实际上是一种递推关系,就是为了得到问题的解,把它推到比原问题简单的问题求解,可分为顺推法和倒推法。
    i.顺推法,就是先找到递推关系式,然后从初始条件出发,一步步地按递推关系式递推,直至求出最终结果

    ii.倒推法,就是在不知道初始条件的情况下,经某种递推关系而获知问题的解,再倒过来,推知它的初始条件。


    示例:猴子分食桃子    五只猴子采得一堆桃子,猴子彼此约定隔天早起后再分食。不过,就在半夜里,一只猴子偷偷起来,把桃子均分成五堆后,发现还多一个,它吃掉这桃子,并拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆。第三只,第四只,第五只猴子都依次如此分食桃子。那么桃子数最少应该有几个呢? 编程简析    怎样编程呢?先要找一下第N只猴子和其面前桃子数的关系。如果从第1只开始往第5只找,不好找,但如果思路一变,从第N到第1去,可得出下面的推导式: 第N只猴    第N只猴分桃之前桃子数目
    5               s(5)=x          //这个数x必需是4的倍数,且x-1必须是5的倍数。
    4               s(4)=s(5)*5/4+1
    3               s(3)=s(4)*5/4+1
    2               s(2)=s(3)*5/4+1
    1               s(1)=s(2)*5/4+1 s1即为所求。可以用循环语句加以解决。 综观程序的整体结构,最外是一个循环,其结束条件则是找到第一个符合条件的数。为了做出上面循环的结束条件,还需进一步分析上述规律的特点,要符合题目中的要求,s2-s5四个数必须全部为4的倍数,这个可作为条件。具体实现请参看源程序。

    程序:
    1. public class Monkeys{
    2.    public static void main(String args[]){
    3.    
    4.     int i=0;

    5.    for(int y=16;;y+=4){
    6.       if((y-1)%5!=0) continue;
    7.        int x=y;
    8.     for(i=4;i>=1&&x%4==0;i--){
    9.          x=(x/4)*5+1;
    10.       
    11.         }
    12.       if(i==0) {
    13.          System.out.println("第五个猴子分桃前的桃子数="+y);
    14.          System.out.println("桃子数="+x);
    15.          break;
    16.       }
    17.    
    18.    
    19.    }
    20.   }
    21.    
    22. }
    23.       
    复制代码
    运行:
      C:java>java Monkeys
    第五个猴子分桃前的桃子数=1276
    桃子数=3121 附:另二种解法:
    1. public class Test {
    2.    
    3.     public static void main(String[] args) {
    4.         System.out.println(d());
    5.        System.out.println(f(0.0));
    6.     }
    7.    
    8.     /**
    9.      * 循环算法
    10.      * peach 分配完毕后剩余的桃子数
    11.      * count 分配之前的桃子数
    12.      * @return
    13.      */
    14.     private static double d() {
    15.         double count = 0.0;
    16.         //死循环,一直到找到这个数为止
    17.         while (true) {
    18.             //每次循环都要桃子数加一
    19.             count++;
    20.             //由桃子总数算出第五个猴子分完后剩下的桃子数,而这个数必须是整数
    21.             double peach = count;
    22.             for (int monkey = 5; monkey > 0; monkey--) {
    23.                 peach = (peach - 1) * 0.8;
    24.             }
    25.             //如果peach是整数,就返回桃子的总数量
    26.             if (peach % 1 == 0.0)
    27.                 return count;
    28.         }
    29.     }
    30.    
    31.     /**
    32.      * 递归算法
    33.      * peach 分配完毕后剩余的桃子数
    34.      * count 分配之前的桃子数
    35.      * @param count
    36.      * @return
    37.      */
    38.     private static double f(double count) {
    39.         count++;
    40.         double peach = count;
    41.         for (int monkey = 5; monkey > 0; monkey--) {
    42.             peach = (peach - 1) * 0.8;
    43.         }
    44.         if (peach % 1 == 0.0)
    45.             return count;
    46.         else
    47.             return f(count);
    48.     }
    49. }
    复制代码


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/26/000608343.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:33 , Processed in 0.352998 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表