《算法设计与分析》实验一_第1页
《算法设计与分析》实验一_第2页
《算法设计与分析》实验一_第3页
《算法设计与分析》实验一_第4页
《算法设计与分析》实验一_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《算法设计与分析》

实验报告一学生姓名张曾然专业、班级16软件二班指导教师唐国峰成绩计算机与信息工程学院软件工程系2018年9月19日实验一:递归策略运用练习一、 实验目的本次实验是针对递归算法的算法设计及应用练习,旨在加深学生对该算法原理的理解,提高学生运用该算法解决问题的能力。二、 实验步骤与要求实验前复习课程所学知识以及阅读和理解指定的课外阅读材料;学生独自完成实验指定内容;实验结束后,用统一的实验报告模板编写实验报告。提交说明:(1) 电子版提交说明:a需要提交Winrar压缩包,文件名为“《算法设计与分析》实验一_学号_姓名”,如“《算法设计与分析》实验一_09290101_张三”。b压缩包内为一个“《算法设计与分析》实验一_学号_姓名”命名的顶层文件夹,其下为两个文件夹,一个文件夹命名为“源程序”另一个文件夹命名为“实验报告电子版”。其下分别放置对应实验成果物。(2) 打印版提交说明:a不可随意更改模板样式。b字体:中文为宋体,大小为10号字,英文为TimeNewRoman,大小为10号字。c行间距:单倍行距。(3) 提交截止时间:2018年10月10日16:00。三、 实验项目1.运用递归策略设计算法实现下述题目的求解过程。题目列表如下:【必做题】(1) 运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。(2) 国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份?(3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼?(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?(5) 猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?(6) 小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少钱页?(7) 日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?(8) 某种传染病第一天只有一个患者,前5天为潜伏期,不发作也不会传染人,第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。【选做题】(5选3)(1) 为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!某批警察叔叔正在进行智力训练:123456789=110;请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9就是一种合格的填法;123+4+5+67-89是另一个可能的答案。请你利用计算机的优势,帮助警察叔叔快速找到所有答案。每个答案占一行。形如:12+34+56+7-8+9123+4+5+67-89(2) 递归将一个整数输出。形如654321,输出1,2,3,4,5,6(3) 用递归实现分解质因数。形如:12=2*2*3(4) 50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?(5) 电话号码对应的字符组合。题目:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。四、实验过程题目一:运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。1.题目分析由题意得,本题存在两个未知数,分别是金牌的总数m和运动会进行的天数n,所以很难从第一天开始进行正向推倒从而算出本题的答案,经过思考我发现本题的突破口是在“到了第N天刚好还有金牌N枚”这句话上,所以可以从最后一天发的金牌数中开始切入。天数(D)NN-1发之前有多少枚(B)NX发之后剩多少枚{A)0 N由题意得,当天发的金牌数是当天的天数D加上发之前的数量发之后的数量0*1/7,同时也等于&A。从而可以根据N-1天的数据建立方程:X-N=(N-1)+X*1/7-(N-1)*1/7X*6/7=N+(N-ir6/7X=7/6*N+(N-1)推倒出了表达式就可以采用递归的思想来进行问题的解答了递归有两个重要组成部分:递归方程:前一天所剩金牌=当天所剩金牌*7/6+当天天数。边界条件:当天的前一天所剩金牌数和当天的天数相等。算法构造在此论证算法设计中的一些必要的设计依据。已经完成了题目分析下面就要将递归方程:(前一天所剩金牌-当天天数)*6/7=当天所剩金牌用代码表示出来,可以通过一个二元数组或者链表结构将当前天数和剩余的金牌数存放起来,设置一个哨兵用来判断(前一天剩余的金牌数-当天天数)能否被7整除,若果不能被7整除则证明所设置的初值不正确,算法实现程序源代码(请写入必要的注释)。First类:;publicclassFirst{publicstaticintbroken(intnum,inttoday){//num为前一天所剩的金牌数,today为当天天数if((num-today)%7!=0) 〃判断前一天所剩金牌数-当天天数能否被7整除,不可以返回0return0;else 〃如果可以返回当天剩余金牌的数量return(num-today)*6/7;}}测试类:;importjava.util.LinkedList;publicclassTest{staticFirstone=newFirst();publicstaticvoidmain(String[]args){LinkedList<Integer>lt=newLinkedList<Integer>();for(intn=3;n<10;n++){//根据题干可知,n>=3,将n的初值设为3可以降低递归算法的重复率for(intm=1;m<100;m++){//利用穷举法计算m的值lt.add(0,m);//第一天没发之前一共有m枚金牌for(inti=1;i<=n;i++){//调用第一题中的判断算法,依次计算每天发了多少枚lt.add(i,one.broken(lt.get(i-1),i));//到达第n天依旧没有符合终止条件的情况跳出循环}if(lt.get(n-1)-n==0){//第n天发了门枚金牌循环终止条件System.out.println("金牌总数为:"+lt.get(0)+”,运动会进行天数为:”+n);}}}}}4.运行结果Problems 3-<te-rmnaied>Te-it*4'|[PawApplcatian]C:\PragramFilesVava''^dklJS.D72\bm\jaMJW.exe1250击牌邑踮汨运法兰虫行尹村由滴经验归纳算法的设计远比想象中的要困难,不紧要熟练掌握高级语言的使用方法,还要透彻的理解题意,仅仅知道递归方程和终结条件是远远不够的,还要在恰当的位置加上准确的判定条件,否则程序将无法达到目标结果。题目二:国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10; ;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份?。1.题目分析本题也存在两个未知数,国王儿子的数量n,以及财产的总数m,由题意得,国王分财产是“一碗水端平的”所以有多少个儿子财产就被分成了多少份,所以可以从最后一个儿子也就是第i个儿子入手,如下图所示:第几个儿子(N)1i-1发之前有多少财广(B)m/iX发之后剩多少财产(A)□m/i由题意得,第j个儿工得到了功份总财产,所以可得出方程组:X-l/i=(i-l)+X*1/104-(1-1)*1/10X=(1-1)4-10/9+m/i递归方程为:前一位王子所剩财产=后一位王子所剩财产数*10/9+前一位王子数。边界条件:当第i个儿子分到m/i财产,每个王子都能被9整除时循环终止。算法构造在此论证算法设计中的一些必要的设计依据。本算法我运用了两个循环,外循环是判断循环终止条件(结合实际当份数第一次满足条件时,即跳出循环不然国王的孩子会越来越多),内循环判断是否每个王子得到的财产都能被9整除。算法实现程序源代码(请写入必要的注释)。;publicclassTreasure{publicstaticvoidmain(String[]args){inti=0;intn=0;intprince[]=newint[100]; 〃规定一个边界值,以免数值过大影响计

算速度(算速度(本题已经确定份数在100份以内)while(true)(n=n+9;prince[n]=n;for(i=n-1;i>=1;i--)所拥有的财产能否被9整除{断前一位if(prince[i+1]%9!=0)〃如果没有break则继续循环〃因为财产数必为9的倍数〃第n个王子得到n份〃从最后一个王子开始往前算每一位王子〃不能则跳出循环,n再加9,可以的话再判(break;}elseprince[i]=prince[i+1]*10/9+i;}if(i==0)break; 〃当所有王子所拥有的财产都能被9整除,及经过若干次i--之后i变成了零} 〃跳出外循环,完成循环终止条件,得出结果System.out.println("国王一共有"+n+"个儿子");System.out.println("一共有资产"+n*prince[1]+",总共分了"+prince[1]+"份");4.运行结果J^.-'adociDeclaration@Console<terminated^Trea&une[JarjaApplication]C:\PragramFile&\Java\jdk1,8.D_73-\fcin\javaw.exe(2018年9月26」I-—11:41:36)HZ-一箕iWl丑%■:箕町l.r5.经验归纳本题与第一题相似只是细微的部分发生了改变,设计的难点还是很难找到循环终止条件题目三出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼?1.题目分析由题意得,本题中仅存在一个未知数,一开始有多少条金鱼,由于已经给出了最后一天卖出了11条金鱼这个信息所以,从后往前便能推出每一天卖之前有多少条金鱼:第几次卖鱼间 LJLJLJ2n卖之前有多少(B)11X■I4■1»■卖之后有多少(A)011X■1ll=X-(X/5+l/5)X=1414=X-(X/4+l/4)X=29如上图所示第三天卖之前还有29条金鱼,经过归纳可得递推公式:f(n)=f(n-1)-[f(n-1)/n+1/n]f(n-1)=[n/(1-n)]*[f(n)+1/n]f(n)=[(n+1/n]*[f(n+1)+1/(n+1)]f(n)表示前一次有多少条鱼f(n+1)表示后一次有多少条鱼;边界条件:当函数中初值取值为5的时候,将11往前传递算法构造在此论证算法设计中的一些必要的设计依据。本题是最显而易见的循环算法,将第几次卖鱼看做一个函数给定一个初值,没有返回值的时候就根据递推方程继续调用自身,直至初值为5将数据传递归还算法实现程序源代码(请写入必要的注释)。;publicclassFish{publicstaticfloatfish(floatn){ 〃第几次卖鱼时共有多少条鱼if(n==5)return(11); 〃如果是第五次卖鱼,则有11条鱼elsereturn((n+1)/n)*(fish(n+1)+1/(n+1));〃前一次卖的鱼等于((n+1)/n)乘以后一次卖的鱼加上后一次分之一}publicstaticvoidmain(String[]args){floatn;n=fish(1); 〃第1次卖鱼时共有多少条鱼System.out.println("第一次共有"+n+"条鱼");}运行结果

JavadocDeclarationSConsole'i':<termin3ted>Fish[JavaApplication]C;\ProgramI-il^^\Java\jclk1.8.0_73\bin\javaw,exe(201S年9月版日T—/iOTHO)第二祯井有5赤条鱼5.经验归纳本题运用了最基本的递归算法思路,自身调用自身,达成条件后将数据传递归还,加深了我对递归含义的运用,以及对该类算法的理解。题目四:某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?O1.题目分析本题与第三题类似,由题意得:1站号:76到站时:6X■■■4下车后:0 6己知到达八号站台时还剩六人,根据题意可列出方程:X*l/2+(8-7)=6X二10,■.从后往前即可依次推出归纳得到了递归方程:5(N)*l/2+(8-N)=S(N+l)边界条件:到达八号站台,并将6作为返还值2.算法构造2.在此论证算法设计中的一些必要的设计依据。本题是最显而易见的循环算法,将第几站上车看做一个函数并给定传入的参数,没有返回值的时候就根据递推方程继续调用自身,直至传入参数为6时将数据传递归还n+1)+n3.n+1)+n3.算法实现程序源代码(请写入必要的注释)。;;publicclassBus{publicstaticfloatstation(floatn){ 〃第几站上车时车上有多少人〃第一站上车时人员不发生变动,所以将第二站作为始发点if(n<7)return(2*(station(n+1)+n-7)); 〃如果传入值不是最后一站则向后递归寻找边界值elsereturn(6); }publicstaticvoidmain(String[]args){floatn;n=station(1); 〃第1站公交车上有多少人System.out.println("第一站公交车上有"+n+"人");}}运行结果_Prablani-. r-De<aratiomSConsole工^tenminated>Bus[JavaApplication!C^Programriles\Javd\jdk1.8.0_73\|jin'\javaw.exe〔2。18年9月西日下斗8:49:54)至一Fl冬土,上fl1心.时经验归纳本题运用了最基本的递归算法思路,自身调用自身,达成条件后将数据传递归还,加深了我对递归含义的运用,以及对该类算法的理解。(五)题目五:猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?。1.题目分析:由题意得,本题只存在一个未知数摘来桃子的数量(与有多少只猴子是无关的),分析后得出第九天刚好吃完,而第九天也吃了剩下的二分之一加1,所以第九天吃之前剩了2个桃子,第八天吃完剩了两个,如下表可得递归方程:1天数:LJUU吃之前:26XBh**吃之后:026■»■«X-2=X*1/2+1X=6X-6=X*1/2+1X=14E[N)=[E(N+1)+1)*2■递归方程:E(N)=(E(N+1)+1)*2边界条件:N等于9时,返还值为2算法构造在此论证算法设计中的一些必要的设计依据。本题是最显而易见的循环算法,将第几天吃之前还剩多少看做一个函数并给定传入的参数,没有返回值的时候就根据递推方程继续调用自身,直至传入参数为9时将数据传递归还算法实现程序源代码(请写入必要的注释)。;publicclassMonkey{publicstaticfloateatPeach(floatn){if(n==9)return(2); 〃循环终止条件,第九天吃之前剩了两个桃子elsereturn(2*(eatPeach(n+1)+1));//如果不满足条件,当天吃之前剩的=((后一天的)+1)*2}publicstaticvoidmain(String[]args){floatn;n=eatPeach(1); 〃算第几天猴子吃之前有多少个桃子eatPeach方法体中写天数System.out.println("猴子们摘来了"+n+"个桃子”);}}运行结果■■Javadoc『;Declaration□ConsoleK<terminatedl>Monkey[JavaApplication]C:\PragramFilesVava\jdk1,8,D_7vaw.exe(2018^9026日下午7诲5:01)稚子们摘^71022-0个桃亍经验归纳本题运用了最基本的递归算法思路,自身调用自身,达成条件后将数据传递归还,加深了我对递归含义的运用,以及对该类算法的理解。题目六:小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少钱页?。题目分析由题意得,第六天刚好读完最后三页,所以如下表可得递归方程:1天数:654«■■1>-4—、 、皿L美乙刖:310--■--■读之后:0 3X-3=X*1/2+2X=10R(N)二(R(N+1)+2)*2边界条件:N等于6时,返还值是3算法构造在此论证算法设计中的一些必要的设计依据。在此论证算法设计中的一些必要的设计依据。本题是最显而易见的循环算法,将第几天读之前还剩多少页没读看做一个函数并给定传入的参数,没有返回值的时候就根据递推方程继续调用自身,直至传入参数为6时将数据传递归还算法实现程序源代码(请写入必要的注释)。;publicclassReading{publicstaticfloatRead(floatn){if(n==6)return(3); 〃循环终止条件,第六天读之前有3页没读elsereturn(2*(Read(n+1)+2));//如果不满足条件,当天读之前剩的页数=((后一天的)+2)*2}publicstaticvoidmain(String[]args){floatn;n=Read(1); 〃算第1天读之前有多少页没读等价于求全书有多少页System.out.println("整本书有"+n+"页");运行结果u,_Problpims。hiuadot:■;C^cla-:ationSConsoleS3<terminated>Reading[JavaApplication]C:\ProgramFilesVJava^jdk1.6.073\bin\javaw.exe[2D1B年9月业日下牛了:58:4切芒!■-7T?20,a?经验归纳本题基于最基本的递归算法思路,自身调用自身,达成条件后将数据传递归还,加深了我对递归含义的运用,以及对该类算法的理解。题目七:日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?题目分析:由题意得,最后大家手中的桔子都一样多,每个人最后都有2520/6=420个桔子,本题与之前的题目不太一样差异在于递归终点与递归起点之间存在联系,可以推出边界条件:第一个孩子得到的桔子总数等于平均数-最后一个孩子分给老大的差乘以8/7.算法构造为了完成这道题目,我构建了一个二维数组a[i][0]表示第i个孩子分出的桔子,a[i][1]表示第i个孩子分到的桔子,定义了两个静态值:分母的最大值8,和分母的最小值3,算法实现如下:算法实现程序源代码(请写入必要的注释)。;publicclassOrange{staticintMAX=8;//分母最大值staticintMIN=3;//分母最小值//a[i][0]表示第i个孩子分出的桔子//a[i][1]表示第i个孩子分到的桔子publicstaticintorange(inta[][],inti){intave=2520/6;intp;if(i==0){//边界条件〃第一个孩子得到的桔子总数等于平均数-最后一个孩子分给老大的差乘以8/7.a[i][1]=(ave-ave/(MIN-1))*(MAX-i)/(MAX-1-i);〃第一个孩子分给第二个孩子的橘子数量a[i][0]=a[i][1]-(ave-ave/(MIN-1));}else{a[i][1]=ave*(MAX-i)/(MAX-i-1)-orange(a,i-1);//第i个孩子分到的〃第i个孩子分出的a[i][0]=a[i][1]+orange(a,i-1)-ave;〃第i个孩子分出的}P=a[i][0];returnp;}publicstaticvoidmain(String[]args){into[][]={{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}};orange(o,5);//给数组里的六个元素赋值for(inti=0;i<=5;i++){System.out.println("第"+(i+1)+"个儿子最初有"+o[i][1]+"个桔子”);}}}运行结果ProblemsJavadoc1DeclaidtionSConsole<'terminated>Orange[JavaApplication]C:\ProgramFik策[八.儿子最初亏2如个桔子策2八儿子最和百弥0个桔子新个儿子最初有个桔子策4个儿子最初有441个桔子第5八儿子最初有A55个桔子新个儿子最初有49。个桔子经验归纳本题与之前的题目不太一样差异在于递归终点与递归起点之间存在联系,所以在分析初期一直找不到入手点,因为之前的题目都存在着明确的循环终点,本题就像一条衔尾蛇一样首尾相连,经过了一段时间的分析才推出了关系,明白了这种类型的题目,其入手点在于最后一个单位和第一个单位之间的联系,将其作为边界条件即可推出结果。(八)题目八:一种传染病第一天只有一个患者,前5天为潜伏期,不发作也不会传染人,第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。题目分析由题意得,前五天不会发作也不会传染给别人,所以可以得出边界条件:当天数小于等于五时,只有一个患者。递归方程为:第N天患病人数等于前一天被传染和发作的加上当天又传染的的减去当天被治愈好的。算法构造我先定义了一个函数diseaseDay,传入一个int值i;传出的结果就是第i天有多少患者,构造如下:publicstaticintdisedseDay(intn){int5um=9;return1"}sum=tfi5e£75eDt7/(n-5)*34-c/t5ec7seOf7y(n-'l);}returnsum;}边界条件:当天数小于等于五时,只有一个患者。递归方程为:第N天患病人数等于前一天被传染和发作的加上当天又传染的的减去当天被治愈好的。算法实现程序源代码(请写入必要的注释)。;importjava.util.Scanner;publicclassDisease{publicstaticintdiseaseDay(intn){intsum=0;if(n<=5){return1; 〃五天之内既不发作也不会传染,所以患病人数就是1}else{sum=diseaseDay(n-5)*3+diseaseDay(n-1)-diseaseDay(n-5);//五天之后患病人数等于前一天被传染和发作的加上当天又传染的的减去当天被治愈好的。}returnsum;}publicstaticvoidmain(String[]args){intn;System.out.println("请输入传染病发生后的天数(疾病五天之后才开始传染)");Scannerscanner=newScanner(System.in);//控制台输入Stringday=scanner.nextLine();n=Integer.parseInt(day);for(inti=1;i<=n;i++){System.out.println("第"+i+"天"+"得病人数为:"+diseaseDay(i)+"人");}}运行结果<terminated>Di^ea^e[JavaApplication]C:\Programrile5Vava\jdk1.8L0_73\bin\javaw.exe(2018^10M5LF午我44:1B1清怖舌:,.;二舌丁=浣,玲亓.布,,什罕哈二,' '20第1天得病人敕加1%1/第玩得病人数为:1第4天得病人数为:1第5天得病人数为:1A新天得病人数为:3\第了夭得病人教为,5A踮』习.".甘第9,得病人数丸9/第16天得病人救为,11■'.第11天得病人数为:口人第U天-病人数为27,',第12天得病A数为:41人天得病人戴为,湖第15天得病人数为,81A第15天得瘾人教如115-1.第17天得病人数为,169/'第天得病人数为:251第13天得病人数为:36S/第粉天髀病人戮为;W1A经验归纳本题所需要考虑的元素比较多,跟之前的题目比起来所需要考虑的范围也要更全面一点,通过完成本道题目,我的思维缜密性得到了加强,逻辑严谨性也得到了很大的提高。选做题:(一)题目一:递归将一个整数输出。形如654321,输出1,2,3,4,5,6。题目分析本题是想要实现将输入进来的字符串进行逆序操作,可以先得到字符串的长度,从长度-1的位置开始输出,直到输出完毕。算法构造:定义一个数组,将字符串分割之后存入数组中,定义一个递归函数,将数组逆序递归遍历出来。算法实现程序源代码(请写入必要的注释)。;importjava.util.Scanner;publicclassX1{staticinti=0; 〃定义一个计数器staticcharinput[]=newchar[10]; 〃定义一个数组,将输入的字符串存储起来publicstaticvoidniXv(Stringmes){if(i<0)return;else{System.out.print(input[i]+"_");i--;niXv(mes);}}publicstaticvoidmain(String[]args){System.out.println(-请输入请输入字符串,算法将对输入的字符串进行逆序操作Scannerscan=newScanner(System.in);Stringcharacter=scan.nextLine(); //控制台输入character.getChars(0,character.length(),input,0);〃将输入的字符串分割之后存入数组i=character.length()-1; //因为i记录的是位置,数组是从0号位置开始存储元素的niXv(character); //调用逆序算法}}运行结果ProblemsJavadoci■,DeclarationElConsole砧<termiinatedl>X1[JavaApplication)C:\ProgramFiIe5\Java\jdkl,8«073\bin\javaw.exe(20118年1曰月7日1^^6:23:02)请输入请输入字符串,算法将对输入的字符串进行谨序操件654321123456经验归纳:本题相对来说比较简单,仅仅是利用数组的性质构建的递归算法。(二)题目二:用递归实现分解质因数。形如:12=2*2*3。题目分析本题的的目的是:输入一个合数,通过算法对其进行质因数分解,质数是只能被1和自身整除的数,所以先定义一个判断是否为质数的算法,在定义一个分解算法,分解算法先判断出在从2到n-1遍历的过程中找到能被目标整数整除还是质数的数,将这个数输出出来之后,用目标数整除它,整除得到的值再放入分解算法之中。算法构造定义一个boolean型的判断算法isZhishu,在定义一个递归算法resolveZhishu,在resolveZhishu之中用到了isZhishu的功能,最后在主函数之中调用了resolveZhishu算法。算法实现;importjava.util.Scanner;publicclassX2{publicstaticbooleanisZhishu(intn){//判断一个数是否是质因数for(inti=2;i<n;i++) 〃从2开始遍历到n-1{if(n%i==0)returnfalse; 〃如果可以被其中一个数整除,则不是质数}returntrue;publicstaticvoidresolveZhishu(intn)(//质因数分解for(inti=2;i<n;i++){if((isZhishu(i))&&(n%i==0)){//判断质因数System.out.println(i);//如果是质因数则将其输出打印出来n=n/i; 〃除以被判断出来的质数resoLveZhishu(n); 〃递归调用除出来的数再继续判断break;}}}publicstaticvoidmain(String[]args){intnum;System.out.println("请输入一个整型数字:");Scannerscan=newScanner(System.in);Stringcharacter=scan.nextLine(); //控制台输入num=Integer.parseInt(character);Systemout.println("整数"+num+"分解质因数结果如下:”);resoLveZhishu(num); //调用分解算法}}运行结果■1-■IVLFFFl-JJJUTTUTMWLL*1VIUI I UhZU—u|^terminated>X2[JavaApplication]CAProqramFilesXJ对前dkL&Q73\bin\javaw.exe〔2。18年1。月7日下午7;14;""一•WM戒r: ' '12憨数12分解质困数结果如E经验归纳:本题我为了让整个算法显得精炼,定义了两个函数,一个判断函数一个分解函数,分解函数调用了判断函数,分解函数在进行递归。(三)题目三:50个阶梯,你一次可以上一阶或

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论