递归vba

合集下载

vb排列递归,要求输入随机n个数,输出m个数的组合

vb排列递归,要求输入随机n个数,输出m个数的组合

VB排列递归算法是一种用于处理组合问题的经典算法。

它可以帮助我们在给定一组数的情况下,找出其中任意个数的排列组合。

在使用中,我们可以输入随机n个数,然后利用VB排列递归算法输出m个数的组合。

今天,我们就来详细介绍一下VB排列递归算法的原理和操作步骤。

一、VB排列递归算法的原理1.1 递归算法递归算法是一种常见的解决问题的方法,它是指在函数的定义中使用函数本身的方法。

在VB排列递归算法中,递归的核心思想是将大问题分解为小问题,然后通过递归调用来解决小问题。

1.2 排列组合在数学中,排列和组合是常见的概念。

排列是指从给定的元素中按照一定顺序选取一定数量的元素,而组合是指从给定的元素中选取一定数量的元素,顺序无关紧要。

VB排列递归算法可以帮助我们高效地求解排列和组合的问题。

二、VB排列递归算法的操作步骤现在,我们来介绍一下使用VB排列递归算法求解组合问题的具体操作步骤。

2.1 输入随机n个数我们需要输入一组随机的n个数,这些数可以是整数、小数或者是字符串,根据实际需求而定。

2.2 设置输出m个数的组合接下来,我们需要设置输出m个数的组合,即从输入的n个数中选取m个数进行组合。

2.3 编写VB排列递归算法在VB编程环境中,我们需要编写排列递归算法的具体代码。

这部分代码主要涉及递归函数的定义和递归调用的实现,通过递归的方式来实现排列组合的求解。

2.4 执行VB排列递归算法一切准备就绪后,我们可以执行VB排列递归算法,得到输出m 个数的组合结果。

这些组合结果可以是打印输出、保存到文件或者在界面中展示,根据实际需求进行选择。

三、VB排列递归算法的应用实例现在,我们通过一个具体的示例来演示VB排列递归算法的应用过程。

3.1 示例说明假设我们有一组数字{1, 2, 3, 4, 5},我们需要从中选取3个数字进行组合,那么该怎么做呢?接下来,我们就通过VB排列递归算法来解决这个问题。

3.2 操作步骤我们需要输入数字{1, 2, 3, 4, 5},然后设置输出3个数字的组合。

2020年计算机等级VB语言核心知识点:递归过程

2020年计算机等级VB语言核心知识点:递归过程

2020年计算机等级VB语言核心知识点:递归过程
【导语】2020年计算机等级考试已经延期,目前这个阶段教材应该看完一遍,大家该强化一下自己对于教材考点的记忆,及时查漏补缺。

下面为您精心整理了2020年计算机等级VB语言核心知识点:递归过程,更多计算机等级考试的备考资讯,请关注为您实时更新的内容。

2020年计算机等级VB语言核心知识点:递归过程
1.递归的概念
通俗的讲,用自身的结构来描述自身就称为“递归”。

如对阶乘运算的定义就是递归的:
n!=n(n-1)!(n-1)!=(n-1)(n-2)!
2.递归子过程和递归函数
VB允许一个自定义子过程或函数过程在过程体的内部调用自己,这样的子过程或函数就叫递归子过程和递归函数。

递归过程包含了递推和回归两个过程。

构成递归的条件是:
(1)递归结束条件和结束时的值
(2)能用递归形式表示,并且递归向结束条件发展。

例:编制程序求fac(n)=n!的函数
3.注意事项
(1)递归算法设计简单,但消耗的上机时间和占据的内存空间比非递归大
(2)设计一个正确的递归过程或函数过程必须具备两点:
1)具备递归条件;
2)具备递归结束条件
(3)一般而言,递归函数过程对于计算阶乘、级数、指数运算有特殊效果。

VBA中常见的内存管理和资源释放方法

VBA中常见的内存管理和资源释放方法

VBA中常见的内存管理和资源释放方法VBA(Visual Basic for Applications)是一种被广泛应用于微软Office应用程序中的编程语言。

在VBA编程中,内存管理和资源释放是非常重要的,以确保代码的稳定性和效率。

本文将介绍VBA中常见的内存管理和资源释放方法,以帮助开发者更好地优化代码。

1. 变量的及时释放在编写VBA代码时,使用变量是必不可少的。

在使用完变量后,及时释放变量所占用的内存空间是非常重要的。

可以通过设置变量为Nothing来释放内存。

例如:```Dim myVariable As ObjectSet myVariable = New Object' 使用myVariableSet myVariable = Nothing ' 释放内存空间```另外,可以使用End语句来终止当前过程,并释放当前过程中的所有局部变量。

例如:```Sub MySub()' 一些代码EndEnd Sub```2. 清空对象的引用在VBA中,许多对象(如工作簿、工作表、Range等)会占用大量的内存空间。

在使用完这些对象后,将其设置为Nothing可以释放其所占用的内存。

例如:```Sub MySub()Dim wb As WorkbookSet wb = Workbooks.Open("路径")' 使用wbwb.CloseSet wb = Nothing ' 释放内存空间End Sub```3. 使用ReleaseComObject函数如果VBA代码中使用了COM(Component Object Model)对象,可以使用ReleaseComObject函数来手动释放COM对象所占用的内存。

ReleaseComObject函数位于Microsoft.VisualBasic命名空间中,需要在代码中进行引用,例如:```Sub MySub()Dim excelApp As ObjectSet excelApp = CreateObject("Excel.Application")' 使用excelAppexcelApp.QuitIf Not excelApp Is Nothing ThenDim o As ObjectFor Each o In excelAppexcelApp.ReleaseComObject(o)Next oEnd IfSet excelApp = Nothing ' 释放内存空间End Sub```4. 使用On Error Resume Next语句在处理大量对象时,VBA代码可能会出现异常错误,导致代码中断。

vb递归函数题型分析

vb递归函数题型分析

vb递归函数题型分析递归函数求最大公约数Public Function gcd(M As Integer, N As Integer) As IntegerIf (M Mod N) = 0 Thengcd = NElsegcd = gcd(N, M Mod N)End IfEnd FunctionPrivate Function fact(N As String) As DoubleIf N <= 1 Thenfact = 1Elsefact = N * fact (N - 1)End IfEnd Function5.执行下面的程序,第一行输出结果是___(23)___,第二行输出结果是___(47)___。

Option ExplicitPrivate Sub Form_Click() 打印 A/XDim A As Integer 2A = 2 5Call Sub1(A) 11 End Sub 23 23 Private Sub Sub1(X As Integer) 47 47 X = X * 2 + 1If X < 10 ThenCall Sub1(X)End IfX = X * 2 + 1Print XEnd Sub示例:(1998年)运行下面的程序,当单击窗体时,窗体上显示的内容的第一行是,第二行是。

Private Sub Test(x As Integer)x = x * 2 + 1If x < 6 ThenCall Test(x)End Ifx = x * 2 + 1Print xEnd SubPrivate Sub Form_Click()Test 2End Sub分析:本程序共发生三次过程调用:第一次是Form_Click对Test调用,第二次和第三次都是Test对自身的递归调用,终止条件是X=11,所以应该有三次的逐层返回。

答案:23475(执行下面程序,单击命令按钮Command1后,显示在窗体上第一行的内容是,第二行的内容是,第三行的内容是。

VBA嵌套字典的递归输出(序列化)

VBA嵌套字典的递归输出(序列化)

VBA嵌套字典的递归输出(序列化)6VBA嵌套字典的递归输出(序列化)作者:AntoniotheFuture关键词:VBA,字典,Dictionary,嵌套,递归,序列化开发平台:VBE平台版本上限:未知平台版本下限:未知开发语言:VBA简介:用递归的方法将一个VBA的嵌套字典对象全部输出到文本框内。

最近笔者的工作中使用到了VBA的Dictionary(字典)对象,这种对象是一种键值对对象,表现形式为:key:item ,其中Key是不可重复的,item也可以为另外一个字典,多个字典嵌套所形成的对象可以让我很方便地操作一个类,我在这一个对象内完成大部分的动作,极大地简化了我的代码。

要创建这样的对象,只需要像下面这样做就行了:1.Dim AllDic as object2.Dim PeopleDic as object3.Dim HousesDic as object4.Dim HouseDic as object5.Dim RommDic as object6.set AllDic = CreateObject('Scripting.Dictionary')7.set PeopleDic = CreateObject('Scripting.Dictionary')8.set HousesDic = CreateObject('Scripting.Dictionary')9.set HouseDic = CreateObject('Scripting.Dictionary')10.set RommDic = CreateObject('Scripting.Dictionary')11.12.RommDic.add 1,'客厅'13.RommDic.add 2,'主卧'15.HouseDic.add 'Addr','中山路3号'16.HouseDic.add 'Price','120万'17.HouseDic.add 'Rooms',RommDic18.19.HousesDic.add 1,HouseDic20.21.RommDic.removeall22.HouseDic.removeall23.24.RommDic.add 1,'客厅'25.RommDic.add 2,'主卧'26.RommDic.add 3,'阳台'27.HouseDic.add 'Addr','西安路58号'28.HouseDic.add 'Price','90万'29.HouseDic.add 'Rooms',RommDic30.HousesDic.add 2,HouseDic31.32.PeopleDic.add 'Name','王明'33.PeopleDic.add 'BirthDate','1990-01-01'34.PeopleDic.add 'Horses',HousesDic35.36.AllDic.add 1,PeopleDic37.38.RommDic.removeall39.HouseDic.removeall40.HousesDic.removeall41.PeopleDic.removeall42.43.RommDic.add 1,'客厅'45.RommDic.add 3,'次卧1'46.HouseDic.add 'Addr','北京路159号'47.HouseDic.add 'Price','145万'48.HouseDic.add 'Rooms',RommDic49.HousesDic.add 1,HouseDic50.PeopleDic.add 'Name','李红'51.PeopleDic.add 'BirthDate','1980-10-01'52.PeopleDic.add 'Horses',HousesDic53.54.AllDic.add 2,PeopleDic这样我们创建了AllDic这样一个嵌套的字典,他的实际内容是这样的:1.AllDic:2.1::'王明'4.BirthDate:'1990-01-01'5.Horses:6.1:7.Addr:'中山路3号'8.Price:'120万'9.Rooms:10.1:'客厅'11.2:'主卧'12.3,'厨房'13.2:14.Addr:'西安路58号'15.Price:'90万'16.Rooms:17.1:'客厅'18.2:'主卧'19.3,'阳台'20.2::'李红'22.BirthDate:'1980-10-01'23.Horses:24.1:25.Addr:'北京路159号'26.Price:'145万'27.Rooms:28.1:'客厅'29.2:'主卧'30.3,'次卧1'31.32.33.34.35.这是一个四层的字典,第二层是人,第三层是房子,第四层是房间,需要引用里面的信息时,只需要像这样就行了:第一个人第二套房子的地址:AllDic(1)('Horses')(2)('Addr')第二个人的生日:AllDic(2)('BirthDate')这种结构是不是似曾相识呢?对的,他就像Json。

vba 10进制转二进制递归算法

vba 10进制转二进制递归算法

vba 10进制转二进制递归算法下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!VBA 10进制转二进制递归算法在VBA编程中,经常需要进行数据之间的转换和计算。

VB函数递归与调用

VB函数递归与调用

6
分析:要求第5个人的年龄,就必须先知道第4个人的年龄,而第4个人
的年龄也不知道,要求第4个人的年龄必须先知道第3个人的年龄,而 第3个人的年龄又取决于第2个人的年龄,第2个人的年龄取决于第1 个人的年龄。而且每一个人的年龄都比其前1个人的年龄大2。第一个 人的年龄已知,根据第一个人的年龄可依次求得第二、三、四、五个 人的年龄。这就是一个递归问题。 而每一个人的年龄都比其前1个人的年龄大2 就是递归成立的条件,也就 是递归公式。 age(5)=age(4)+2 age(4)=age(3)+2
故事可以一直讲下去,每一个故事内容都相同, 但却是故事里的故事。
程序设计中,函数A自己调用自己,称为直接
递归调用 2021/10/10

3
情景2:
镜子A和镜子B相对放在一起,你会发现什么 现象呢?
A
2021/10/10
对了,我们会发现镜子
A中有镜子B的映象,镜
子B中又镜子A的映象,
这样层层叠叠,无穷无
输入数据: 第一行是测试数据的组数n,后面跟着n行输入,每组测试数据占1行,包 括一个正整数b(1<=b<=92)。
toneedle)
} 按照上述算法可编写出如下C语言程序:
2021/10/10
19
#include<stdio.h> void main() { void movedisk(int n,char fromneedle,char tempneedle,char toneedle); int n; printf (“Pleases input the number of diskes:”); scanf(“%d”,&n); printf (“The step moving diskes is:\n”); movedisk (n,’A’,’B’,’C’); } void movedisk(int n,char fromneedle,char tempneedle,char toneedle) { if (n==1) printf (“%c%c\n”,fromneedle,toneedle ); else { movedisk(n-1,fromneedle,toneedle,tempneedle ); printf (“%c%c\n”,fromneedle,toneedle ); movedisk (n-1,tempneedle,fromneedle,toneedle ); } }

vba递归算法借数独

vba递归算法借数独

vba递归算法借数独递归算法在解决数独问题时非常有用,因为它允许我们分解问题,使其变得更容易解决。

以下是一个简单的VBA递归算法示例,用于解决数独问题。

请注意,这个示例假设你已经有了一个数独问题的初始状态(一个二维数组),并且你正在尝试填充空白单元格。

vba复制代码Sub SolveSudoku(board As Variant, row As Integer, col As Integer)Dim i As IntegerDim nextRow As IntegerDim nextCol As Integer' 检查是否所有单元格都已填充If row = UBound(board, 1) + 1 Then' 打印解决方案或执行其他操作PrintSudoku(board)Exit SubEnd If' 查找下一个空白单元格If board(row, col) = 0 Then' 尝试填充当前单元格For i = 1 To 9If IsValid(board, row, col, i) Thenboard(row, col) = i' 移动到下一个单元格nextRow = rownextCol = col + 1If nextCol > UBound(board, 2) ThennextRow = nextRow + 1nextCol = 1End If' 递归调用以填充下一个单元格SolveSudoku(board, nextRow, nextCol)' 如果递归调用没有返回解决方案,则回溯并尝试下一个数字board(row, col) = 0End IfNext iElse' 如果当前单元格已填充,则移动到下一个单元格nextRow = rownextCol = col + 1If nextCol > UBound(board, 2) ThennextRow = nextRow + 1nextCol = 1End If' 递归调用以填充下一个单元格SolveSudoku(board, nextRow, nextCol)End IfEnd SubFunction IsValid(board As Variant, row As Integer, col As Integer, num As Integer) As BooleanDim i As IntegerDim j As Integer' 检查行中是否已存在该数字For i = 1 To UBound(board, 2)If board(row, i) = num ThenIsValid = FalseExit FunctionEnd IfNext i' 检查列中是否已存在该数字For j = 1 To UBound(board, 1)If board(j, col) = num Then IsValid = FalseExit FunctionEnd IfNext j' 检查3x3子网格中是否已存在该数字Dim startRow As IntegerDim startCol As Integer startRow = (row - 1) \ 3 * 3 + 1 startCol = (col - 1) \ 3 * 3 + 1For i = startRow To startRow + 2 For j = startCol To startCol + 2If board(i, j) = num ThenIsValid = FalseExit FunctionEnd IfNext jNext i' 如果所有检查都通过,则数字有效IsValid = TrueEnd FunctionSub PrintSudoku(board As Variant)Dim i As IntegerDim j As IntegerFor i = 1 To UBound(board, 1)For j = 1 To UBound(board, 2)Debug.Print board(i, j),Next jDebug.Print ""Next iEnd Sub在这个示例中,SolveSudoku函数是递归的核心。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

递归是怎么一回事? 递归通俗的讲就是一个函数在其代码中反复调用自身。

你应该知道菲波纳契数列,这个数列的定义是:f(x)=1 (x=1)f(x)=2 (x=2)f(x)=f(x-1)+f(x-2) (x>2)也就是说从第三项开始的每一项的值都等于是前两项之和。

这在数学中叫递推数列--高中数学内容。

说到本质的话,递归是一段程序的代码反复效用,把程序的参数等变量保存在一个堆栈里,直到到了边界条件以后再层层返回,将堆栈中的数据弹出计算,最后得到结果。

补充一下,递规包括直接递规和间接递规。

直接递规是指在代码中反复调用自身,而间接递规是间接地调用自身。

递归概念最通俗的形象比喻:打个比方吧,递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路上的下一个分岔口,于是小队长再分派人手各自去探路??只要人手足够(对照而言,就是计算机的堆栈足够),最后必将有人找到出口,从这人开始只要层层上报直属领导,最后,将军将得到一条通路。

所不同的是,计算机的递归法是把这个并行过程串行化了。

递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。

规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

什么是递归函数(recursive function)递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。

VB函数递归使用实例链接:/t/20050125/22/3753710.html用VB函数Dir实现递归搜索目录实例链接:/Develop/article/28/68489.shtm遍历所有文件夹的递归函数(epower2002)Sub Main()ProcessDirectory("E:\My Documents")Console.ReadLine()End SubPrivate Sub ProcessDirectory(ByVal targetDirectory As String)If Directory.Exists(targetDirectory) ThenIf Directory.GetFileSystemEntries(targetDirectory).Length = 0 Then' Empty folderConsole.WriteLine("Folder " & targetDirectory & " is empty")Else' Recurse subdirectories of this directoryDim subdirectory As StringDim subdirectoryEntries As String() =Directory.GetDirectories(targetDirectory)For Each subdirectory In subdirectoryEntriesConsole.WriteLine("Folder is " & subdirectory)ProcessDirectory(subdirectory)Next subdirectoryEnd IfEnd IfEnd Sub/art/1111/20041219/692239_1.html查找给定文件夹下的全部文件,递归调用堆栈溢出:链接:/t/20060303/09/4589903.html递归算法用自身的结构来描述自身,称递归VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function 函数。

递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。

递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。

例:编fac(n)=n! 的递归函数Function fac(n As Integer) As IntegerIf n = 1 Thenfac = 1Elsefac = n * fac(n - 1)End IfEnd Function递归程序的基本步骤每一个递归程序都遵循相同的基本步骤:1. 初始化算法。

递归程序通常需要一个开始时使用的种子值(seed value)。

要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。

2. 检查要处理的当前值是否已经与基线条件相匹配。

如果匹配,则进行处理并返回值。

3. 使用更小的或更简单的子问题(或多个子问题)来重新定义答案。

4. 对子问题运行算法。

5. 将结果合并入答案的表达式。

6.返回结果。

递归算法的基本思想递归算法一般都包含三个基本部分:1、当前问题Q n2、从较简单的问题Q n-1到Q n的操作Op n-13、已解决的基础问题Q0这样,当前问题Q n就可以被一步一步化简为:Q nOp n-1 + Q n-1...Op n-1 + Op n-2 + Op n-3 ... +Q0这样一些列确定的步骤而最终得到解决。

递归算法解题的一般思路在一个子程序(过程或函数)的定义中又直接或间接地调用该子程序本身,称为递归。

递归是一种非常有用的程序设计方法。

用递归算法编写的程序结构清晰,具有很好的可读性。

递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。

规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

利用递归算法解题,首先要对问题的以下三个方面进行分析:一、决定问题规模的参数。

需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。

二、问题的边界条件及边界值。

在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。

三、解决问题的通式。

把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。

把这些步骤或等式确定下来。

把以上三个方面分析好之后,就可以在子程序中定义递归调用。

其一般格式为:if 边界条件1成立 then赋予边界值1【elseif 边界条件2成立then赋予边界值2┇】else调用解决问题的通式endif例1:计算勒让德多项式的值x、n由键盘输入。

分析:当n=0或n=1时,多项式的值都可以直接求出来,只是当n>1时,才使问题变得复杂,决定问题复杂程度的参数是n。

根据题目提供的已知条件,我们也很容易发现,问题的边界条件及边界值有两个,分别是:当n=0时P n(x) =1和当n=1时P n(x) =x。

解决问题的通式是:P n(x) =((2n-1)P n-1(x) -(n-1)P n-2(x))/n。

接下来按照上面介绍的一般格式定义递归子程序。

function Pnx(n as integer)if n=0 thenPnx=1elseif n=1 thenPnx=xelsePnx=((2*n-1)*Pnx(n-1)-(n-1)*Pnx(n-2))/nendifend function例2:Hanoi塔问题:传说印度教的主神梵天创造世界时,在印度北部佛教圣地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着三根宝石针,在其中一根宝石针上,自下而上地放着由大到小的64个金盘。

这就是所谓的梵塔(Hanoi),如图。

梵天要求僧侣们坚持不渝地按下面的规则把64个盘子移到另一根针上:(1) 一次只能移一个盘子;(2) 盘子只许在三根针上存放;(3) 永远不许大盘压小盘。

梵天宣称,当把他创造世界之时所安放的64个盘子全部移到另一根针上时,世界将在一声霹雳声中毁灭。

那时,他的虔诚的信徒都可以升天。

要求设计一个程序输出盘子的移动过程。

分析:为了使问题更具有普遍性,设共有n个金盘,并且将金盘由小到大依次编号为1,2,…,n。

要把放在s(source)针上的n个金盘移到目的针o(objective)上,当只有一个金盘,即n=1时,问题是比较简单的,只要将编号为1的金盘从s针上直接移至o针上即可。

可定义过程move(s,1,o)来实现。

只是当n>1时,才使问题变得复杂。

决定问题规模的参数是金盘的个数n;问题的边界条件及边界值是:当n=1时,move(s,1,o)。

当金盘不止一个时,可以把最上面的n-1个金盘看作一个整体。

这样n个金盘就分成了两个部分:上面n-1个金盘和最下面的编号为n的金盘。

移动金盘的问题就可以分成下面三个子问题(三个步骤):(1)借助o针,将n-1个金盘(依照上述法则)从s针移至i(indirect)针上;(2)将编号为n的金盘直接从s针移至o针上;(3)借助s针,将i针上的n-1个金盘(依照上述法则)移至o针上。

如图其中第二步只移动一个金盘,很容易解决。

第一、第三步虽然不能直接解决,但我们已经把移动n 个金盘的问题变成了移动n-1个金盘的问题,问题的规模变小了。

如果再把第一、第三步分别分成类似的三个子问题,移动n-1个金盘的问题还可以变成移动n-2个金盘的问题,同样可变成移动n-3,…,1个金盘的问题,从而将整个问题加以解决。

这三个步骤就是解决问题的通式,可以以过程的形式把它们定义下来:hanoi(n-1,s,o,i)move(s,n,o)hanoi(n-1,i,s,o)参考程序如下:declare sub hanoi(n,s,i,o)declare sub move(s,n,o)input "How many disks?",ns=1i=2o=3call hanoi(n,s,i,o)endsub hanoi(n,s,i,o)rem 递归子程序if n=1 thencall move(s,1,o)elsecall hanoi(n-1,s,o,i)call move(s,n,o)call hanoi(n-1,i,s,o)endifend subsub move(s,n,o)print "move disk";n;print "from";s;"to";oend sub递归找迷宫EXCEL VBA]EXCEL中用递归实现任意n(3≤n≤256)阶幻方本文Tag:excel vba excel 递归幻方p,/Article/38fedcf4-a4ed-4dd7-bb3c-5fb5362ca477.htmlEXCEL VBA]EXCEL中用递归实现任意n(3≤n≤256)阶幻方下面代码将实现任意n(3≤n≤256)阶幻方,显示在EXCEL的A1:IV256中Sub magicsquare(ByVal n As Long, ByRef matrix())Dim i As Long, j As Long, k As Long, p As Long, a(), temp As New Collection ReDim matrix(1 To 256, 1 To 256)If n < 3 Then MsgBox "n must be larger than 2! ": Exit SubIf n Mod 4 = 0 ThenReDim a(1 To n, 1 To n)ReDim b(1 To n, 1 To n)For i = 1 To nFor j = 1 To nmatrix(i, j) = IIf((i Mod 4) \ 2 = (j Mod 4) \ 2, n * n + 1 - (i - 1) * n - j, (i - 1) * n + j)NextNextElseIf n Mod 4 = 2 Thenp = n / 2ReDim a(1 To p, 1 To p)magicsquare p, aFor i = 1 To pFor j = 1 To pmatrix(i, j) = a(i, j)matrix(i + p, j) = a(i, j) + 3 * p * pmatrix(i, j + p) = a(i, j) + 2 * p * pmatrix(i + p, j + p) = a(i, j) + p * pNextNextFor i = 1 To (n - 2) / 4temp.Add iNextFor i = 3 * (n - 2) / 4 + 1 To ntemp.Add iNextFor i = 1 To pFor j = 1 To temp.Countk = matrix(i, temp(j))matrix(i, temp(j)) = matrix(i + p, temp(j))matrix(i + p, temp(j)) = kNextNextElseFor j = 0 To n - 1For i = 0 To n - 1If j = 0 Then matrix(j + 1, i + 1) = IIf(i >= (n - 1) / 2, 0, n * (n + 1)) + (i - (n - 1) / 2) * (n + 2) + 1If j > 0 Then matrix(j + 1, i + 1) = 1 + (n * n + matrix(j, i + 1) + IIf(matrix(j, i + 1) Mod n = 0, 0, n)) Mod n ^ 2NextNextEnd IfEnd IfEnd SubSub makemagicsquare()Dim arr(), n As LongRandomizen = CLng(InputBox("please enter an integer", "infomation",3+Int(Rnd*254)))magicsquare n, arrRange("a1").Resize(256, 256) = arrRange("a1").Resize(256, 256).Columns.AutoFitEnd Sub/northwolves/archive/2006/09/28/1303247.aspxclamber各位兄弟看看,VBA中的递归怎么不行呢?Private Sub CommandButton1_Click()Dim aa, bb As Longaa = 10bb = f_1(aa)[color=Red]''bb = f_1(aa)不行,''bb = f_1(10)就可以,可是我有时我想动态指定aa的值.[/color]MsgBox bbEnd SubPublic Function f_1(temp As Long) As VariantIf temp = 1 Thenf_1 = 1Elsef_1 = temp * f_1(temp - 1)End IfEnd Function2004-12-21 15:46 clamber报告的出错类型是"Bybef argument type mismatch"2004-12-21 15:56 apollohDim aa as long, bb As Long2004-12-21 15:59 zgh058如下:Private Sub CommandButton1_Click()Dim aa, bb As Longaa = 10bb = f_1((aa))MsgBox bbEnd SubPublic Function f_1(temp As Long) As VariantIf temp = 1 Thenf_1 = 1Elsef_1 = temp * f_1(temp - 1)End IfEnd Function2004-12-21 16:01 zgh058还是3楼正解,我取了个捷径,只是在避免出错而已。

相关文档
最新文档