《(32)--4-4-5 Visual Basic 程序设计循环的应用(2).ppt》由会员分享,可在线阅读,更多相关《(32)--4-4-5 Visual Basic 程序设计循环的应用(2).ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4-4-5 循环的应用(2)Visual Basic程序设计本节内容递推问题穷举问题121.穷举问题“穷举法”也称为“枚举法”或“试凑法”,基本思想是列出事件所有可能出现的各种情况,逐一检查每个状态是否满足指定的条件。例编写程序实现用一元人民币换成一分、两分、五分的硬币共50枚的各种兑换方案。分析:假设一分、两分、五分的硬币各为i,j,k枚,根据题目要求,列出方程组为:采用“试凑法”解决方程组的求解问题,即用i、j、k变量的每一个可能取值都进行尝试。i+j+k=50i+2j+5k=1001.穷举问题方法一:使用三重循环结构。实现代码如下Dim i%,j%,k%For i=0 To 50 For
2、 j=0 To 50 For k=0 To 50 If i+j+k=50 And i+2*j+5*k=100 Then Print i,j,k End If Next k Next jNext i循环次数为51*51*51 即 132651 次 1.穷举问题方法二:使用两重循环结构。由于总共兑换成50枚硬币,故5分银币数目可以由1分硬币和2分银币的数目得到,即k=50-i-j。实现代码如下Dim i%,j%,k%For i=0 To 50For j=0 To 50 k=50-i-j If i+2*j+5*k=100 Then Print i,j,k End If Next jNext i循环次
3、数为51*51 即2601次 1.穷举问题方法三:使用两重循环结构。由于总共兑换成50枚硬币,而5分银币不可能超过20枚,同样2分银币不可能超过50枚,所以每重循环不需要循环50次。实现代码如下Dim i%,j%,k%For k=0 To 20For j=0 To 50 i=50-k-j If i+2*j+5*k=100 Then Print i,j,k End IfNext jNext k循环次数为21*51 即1027次 1.穷举问题方法四:使用单重循环结构实现。由方程组可以得到以下关系:j=504*k,i=50 j k。其中5分硬币的数量不可能超过13枚。实现代码如下 Dim i%,j%
4、,k%For k=0 To 12 j=50-4*k i=50-j-k Print i,j,kNext k循环次数为13次 1.穷举问题i+j+k=50i+2j+5k=100所谓水仙花数,是这样的一位三位数,其各位数字立方和等于该数字本身。例如,153=1*1*1+5*5*5+3*3*3,所以153是水仙花数。所以,水仙花数算法的关键是如何将一个数转化为它的每一位的数,在此采用算术运算符mod和来实现。Dim i,a,b,c As IntegerFor i=100 To 999a=i Mod 10 取个位b=(i 10)Mod 10 取十位c=i 100 取百位If i=a*a*a+b*b*b+
5、c*c*c Then Print iEnd IfNext i 类似的有水仙花数1.穷举问题“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复,利用自身的推导关系求解问题的方法。每次重复都从旧值的基础上递推出新值,并由新值代替旧值,利用前面已知数据推算出后面未知数据。2.递推问题例 猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子?分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。设第n
6、天的桃子为xn,那么它是前一天的桃子数xn-1 的一半减12.递推问题Private Sub Form_Click()Dim n%n存储桃子数n=1 第7天的桃子数Print 第7天的桃子数为&nFor i=6 To 1 Step-1 从第6天开始逆推 n=(n+1)*2 Print 第&i;天的桃子数为&nNext iEnd Sub2.递推问题例输出Fibonacci数列的前20项分析:1202年,意大利数学家斐波那契在算盘全书中提到Fibonacci数列,定义如下:f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2),n2。因此,Fibonacci数列为 1、1、2、3、5、8
7、、13、21、34、,推理为f(3)=f(2)+f(1)、f(4)=f(3)+f(2)、f(5)=f(4)+f(3)、,112358F1F2f前一次变量取值位置F1F2f后一次变量取值位置2.递推问题Dim i As IntegerDim f1%,f2%,f%f为从第三项开始到第20项的具体每项的值f1=1:f2=1 给Fibonacci数列前两项赋初值For i=3 To 20 Step 1 循环变量i从第三项开始到第20项变化 f=f2+f1 Fibonacci数列 Print f;Space(2);输出第n项 f1=f2 将原先f2的旧值赋值给新的变量f1 f2=f 将原先f的旧值赋值给新的变量f2Next i2.递推问题例S=2+22+222+2222+22222+222222 (6项之和)Dim sum As Long,i As Integersum=0:x=2For i=1 To 6 sum=sum+x x=x*10+2Next iPrint sum=;sum2.递推问题u穷举问题穷举问题u递推问题递推问题模块小结模块小结