博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
检测递归
阅读量:5066 次
发布时间:2019-06-12

本文共 1333 字,大约阅读时间需要 4 分钟。

      我们编写一些比较复杂的程序时,可能会碰到递归,比如修改对象1的数据时,程序会相应的修改对象2的数据,而修改对象2的数据是,程序也要相应的修改对象1的数据,如此一来,就会碰到递归,相信有些人碰到过这种情况吧。对于这种情况,很自然的定义一些标志变量来进行判断,当修改对象1的数据前,设置一个标记,修改数据完毕后取消标记,而对象2修改对象1的数据前首先判断这个标记,若已经设置了该标记则不去修改对象1的数据,否则去修改对象1的数据。但这样做不大方便,需要专门定义公开成员来处理这种情况,

    在这里,小弟提出以下方法,使用应用程序的调用堆栈来判断是否存在递归。.NET程序可以从类型System.Diagnostics.StackTrace中获得当前应用程序的调用堆栈。StackTrace的FrameCount属性表示堆栈的层数,而StackTrace的GetFrame函数返回StackFrame对象,该对象保存着单个堆栈层的信息。StackFrame的GetMethod成员返回该堆栈层执行的方法的对象。根据StackTrace和StackFrame对象,我们可以遍历整个堆栈来判断是否出现递归。为此小弟写下一个例程。 

///
 
<summary>
///
 检查调用本方法的方法是否发生了递归
///
 
</summary>
///
 
<remarks>
本函数是利用应用程序调用堆栈来判断是否存在递归
</remarks>
///
 
<returns>
若发生了递归则返回true,否则返回false
</returns>
public
 
static
 
bool
 CheckRecursion()
{
   System.Diagnostics.StackTrace myTrace 
=
 
new
 System.Diagnostics.StackTrace();
   
//
 若堆栈小于三层则不可能出现递归
   
if
 (myTrace.FrameCount 
<
 
3
)
      
return
 
false
;
   System.IntPtr mh 
=
 myTrace.GetFrame(
1
).GetMethod().MethodHandle.Value;
   
for
 (
int
 iCount 
=
 
2
; iCount 
<
 myTrace.FrameCount; iCount
++
)
   {
      System.Reflection.MethodBase m 
=
 myTrace.GetFrame(iCount).GetMethod();
      
if
 (m.MethodHandle.Value 
==
 mh)
      {
         
return
 
true
;
      }
   }
   
return
 
false
;
}

只要在某个函数中随意的调用CheckRecursion函数,就可以判断是否出现递归。而且根据这个原理,我们还可以获得递归的次数。

   这种方法使用比较方便,但实践证明,它是比较慢的,因此不适合非常频繁的调用。当需要频繁反递归时,还是要老老实实的使用标记变量来进行判断。

XDesigner软件工作室( )

转载于:https://www.cnblogs.com/xdesigner/archive/2006/08/02/465483.html

你可能感兴趣的文章
Linux下安装JDK
查看>>
[HDU] 3711 Binary Number [位运算]
查看>>
908. Smallest Range I
查看>>
ThinkPHP 分页实现
查看>>
jQuery在线手册
查看>>
APPLE-SA-2019-3-25-3 tvOS 12.2
查看>>
Python定义点击右上角关闭按钮事件
查看>>
刚刚开始
查看>>
Optional 的基本用法
查看>>
洋葱第4场C和D题解……
查看>>
php实现隐藏字符串的功能
查看>>
设计模式08: Composite 组合模式(结构型模式)
查看>>
编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...
查看>>
公网IP和私有IP的区别和用途
查看>>
在一台win10上启动多个mysql
查看>>
TensorFlow 从零到helloWorld
查看>>
@class、#import
查看>>
iOS 正则表达式使用的三种方式&语法
查看>>
kafka的使用
查看>>
AT2672 Coins
查看>>