递归编程

学习Excel技术,关注微信公众号:

excelperfect

递归编程是一种强大的编程技术,可以极大地简化一些编程任务或者完成一些其他方式无法完成的任务。顾名思义,递归编程就是程序自己调用自己,在调用过程中传入参数的修改值。通常,递归编程包含至少两个过程:设置初始状态并对递归过程进行初始调用的过程;递归过程本身调用一次或多次。

让我们从一个简单的例子开始,这个例子也是介绍递归的经典示例。数字N的阶乘是1和N之间所有整数的乘积,例如5的阶乘等于5 * 4 * 3 * 2 * 1= 120。这里编写程序:第一个名为DoFact的过程进行设置,调用Fact函数并显示结果。

Sub DoFact()

Dim L As Long

Dim N As Long

N = 5

L = Fact(N)

Debug.Print CStr(N) & "的阶乘是" &Format(L, "#,##0")

End Sub

Function Fact(N As Long) As Long

If N = 1 Then

Fact = 1

Else

Fact = N * Fact(N - 1)

End If

End Function

在上述代码中,实际上是由Fact函数来计算数的阶乘的。

测试所输入的值N,如果它是1,该函数只返回1;如果N大于1,Fact函数调用自己传递值N-1。该函数返回作为其结果的输入值N乘以N-1的自身评估值。

注意,在递归编程时,必须小心构建代码,以便在满足某些条件时正确终止程序。在Fact函数过程中,我们在N小于或等于1时结束递归调用。你的递归代码必须具有某种终止递归调用的转义逻辑,如果没有这种转义逻辑,代码将不断循环,直到 VBA 运行时因堆栈空间不足错误而中止处理。注意,你无法使用常规错误捕获来捕获堆栈空间外错误,这被称为不可捕获的错误,将立即终止所有VBA代码的执行,且不能从无法捕获的错误中恢复。

例如,下面是一个不好的递归过程:

Function AddUp(N As Long)

Static R As Long

If N <= 0 Then

R = 0

End If

R = AddUp(N + 1)

AddUp = R

End Function

在这段代码中,没有任何条件阻止AddUp过程调用其自身,对AddUp过程的每次调用都会导致对AddUp过程的另一个调用。该函数将继续不受限制地调用自身,直到VBA运行时中止过程执行序列。

示例:列出文件夹及子文件夹

下面的代码在工作表中列出指定文件夹中的所有子文件夹。

Dim FSO As Scripting.FileSystemObject

Sub StartListing()

Dim TopFolderName As String

Dim TopFolderObj As Scripting.Folder

Dim DestinationRange As Range

TopFolderName = "D:\完美Excel"

Set DestinationRange =Worksheets(1).Range("A1")

If FSO Is Nothing Then

Set FSO = NewScripting.FileSystemObject

End If

Set TopFolderObj =FSO.GetFolder(TopFolderName)

ListSubFolders OfFolder:=TopFolderObj,DestinationRange:=DestinationRange

End Sub

Sub ListSubFolders(OfFolder As Scripting.Folder, DestinationRange As Range)

Dim SubFolder As Scripting.Folder

DestinationRange.Value = OfFolder.Path

Set DestinationRange =DestinationRange.Offset(1, 1)

For Each SubFolder In OfFolder.SubFolders

ListSubFolders OfFolder:=SubFolder,DestinationRange:=DestinationRange

Next SubFolder

Set DestinationRange = DestinationRange(1,0)

End Sub

希望本文能让你对递归编程有一个基本的了解。递归是一个强大的工具,值得掌握。

注:本文学习整理自cpearson.com,供参考。

本文分享自微信公众号 - 完美Excel(excelperfect),作者:fanjy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网易递归编程题,魔法币

    输入描述: 输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。

    RobinsonZhang
  • JS编程: 递归

    想成为一个更好的开发者,那么理解数据结构、算法和基本编程思想是必须的。现在大多数问题都被现代工具和各种库解决了,但是对这些领域有一个更深的了解,将会大大拓宽你软...

    疯狂的技术宅
  • Kotlin 函数式编程 + 递归 : 构建 "树" 数据结构通用模型

    注意到这里的@Id 生成策略是我们自定义的: com.ak47.cms.cms.tree.CustomUUIDGenerator

    一个会写诗的程序员
  • 递归与尾递归

    在介绍递归与尾递归之前,我们来看看递归的定义:程序调用自身的编程技巧称为递归( recursion)

    踏浪
  • 递归与伪递归区别,Python 实现递归与尾递归

          递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函 数。(1) 递归就是在过程或函数里调用自身。(2) 在使...

    学到老
  • 递归与伪递归区别,Python 实现递归与尾递归

          递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函 数。(1) 递归就是在过程或函数里调用自身。(2) 在使...

    学到老
  • 递归的编译优化(1)

      本系列文章是想思考思考递归的编译优化问题,目标在于希望如何从编译、解释层次将树递归进行优化,从而避免过低效率运行。本章来讲讲树递归的问题。

    窗户
  • 递归程序设计

     一般定义: 程序调用自身的编程技巧称为递归(recursion)。  递归做为一种算法设计技巧,是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重...

    用户1215536
  • 各种编程语言对尾递归的支持

      这篇文章,我们讲尾递归。在递归中,如果该函数的递归形式表现在函数返回的时候,则称之为尾递归。

    窗户
  • 漫谈递归转非递归

    一:递归的思想       之前面试腾讯,面试官问了一个问题:说说递归和循环的区别?当时没有答出问题的本质,只是简单地解释了这两个词的意思,囧,今天就借由这篇文...

    猿大白
  • 递归与尾递归简析

    与之相对的是非尾递归函数,你先执行递归调用,然后获取递归调用的结果进行计算, 这样你需要先获取每次递归调用的结果,才能获取最后的计算结果。看下面计算n阶乘的函数...

    java达人
  • 递归与尾递归总结

    关于递归的概念,我们都不陌生。简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条...

    狼啸风云
  • 递归

    递归就是函数或者方法自己调用自己的过程。在生活中,我们睡觉,闹钟叫我们起床就可以看做一个递归的过程。我们每天睡觉就可以看做成函数的执行。每天都要睡觉,这就是函数...

    微醺
  • 递归

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

    zy010101
  • 递归

    注意:递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件return。

    星辰_大海
  • 递归

    概念:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

    乐心湖
  • 递归

    函数的嵌套调用是:函数嵌套函数。函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身。

    py3study
  • 递归

    若尘_
  • 二叉树的非递归遍历(递归和非递归)

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,...

    猿人谷

扫码关注云+社区

领取腾讯云代金券