当前位置:  编程技术>.net/c#/asp.net

C#避免回溯方法心得

    来源: 互联网  发布时间:2014-11-03

    本文导语:  本文实例讲述了C#避免回溯方法,分享给大家供大家参考之用。具体分析如下: 首先,回溯法是不可控的,有时候会超出我们意料之外产生不妙的结果,最常见的也就是内存泄漏。。 回溯方法是很容易想到,又不容易想到的,...

本文实例讲述了C#避免回溯方法,分享给大家供大家参考之用。具体分析如下:

首先,回溯法是不可控的,有时候会超出我们意料之外产生不妙的结果,最常见的也就是内存泄漏。。

回溯方法是很容易想到,又不容易想到的,往往,我们思维更容易进入的是回溯法。但是回溯法有着它的弊端,非常明显的弊端是作用域内产生的变量和引用在回溯法调用未完成时,不能释放(对于大部分编辑器来说,排除有着优化能力的编辑器)。如果我们在某一方法中使用极多的回溯调用,在方法中不能及时的对方法作用域内的变量和引用释放,最终会造成内存不足和cpu的计算负荷增大(内存机制中可以将过剩的数据转存到虚拟内存、硬盘,这个就不说了)。使用栈(队)式的循环,可以轻易避免回溯法,而且栈(队)式的数据再使用之后可以很方便的抛出移除。某些时候就是这样,一个小小的改动,可以让一个程序在某种特定的环境中起死回生。(之前做过一个数独运算器的算法,后来的优化改进就是为了避免回溯)

示例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace 避免回溯方法
{
  class Program
  {
    static void Main(string[] args)
    {
      string path = AppDomain.CurrentDomain.BaseDirectory;

      List fileList1 = new List();
      FunctionHuishuo(path, ref fileList1);

      List fileList2 = new List();
      FunctionQueue(path, ref fileList2);

      List fileList3 = new List();
      FunctionStack(path, ref fileList3);
    }

    /// 
    /// 回溯法
    /// 
    /// 
    /// 
    private static void FunctionHuishuo(string path, ref List fileList)
    {
      if (true)
      {
        string[] files = null;
        try
        {
          files = Directory.GetFiles(path);
        }
        catch { }

        if (files != null && files.Length > 0)
        {
          fileList.AddRange(files);
        }
      }

      if (true)
      {
        string[] folders = null;
        try
        {
          folders = Directory.GetDirectories(path);
        }
        catch { }

        if (folders != null && folders.Length > 0)
        {
          foreach (string folder in folders)
          {
            FunctionHuishuo(folder, ref fileList);
          }
        }
      }
    }

    /// 
    /// 堆栈法
    /// 
    /// 
    private static void FunctionStack(string path, ref List fileList)
    {
      Stack stack = new Stack();
      stack.Push(path);

      while (stack.Count > 0)
      {
        string dir = stack.Pop();

        string[] files = null;
        try
        {
          files = Directory.GetFiles(dir);
        }
        catch { }

        if (files != null && files.Length > 0)
        {
          fileList.AddRange(files);
        }

        string[] folders = null;
        try
        {
          folders = Directory.GetDirectories(dir);
        }
        catch { }

        if (folders != null && folders.Length > 0)
        {
          foreach (string folder in folders)
          {
            stack.Push(folder);
          }
        }
      }
    }

    /// 
    /// 队列法
    /// 
    /// 
    private static void FunctionQueue(string path, ref List fileList)
    {
      Queue queue = new Queue();

      queue.Enqueue(path);

      while (queue.Count > 0)
      {
        string dir = queue.Dequeue();

        string[] files = null;
        try
        {
          files = Directory.GetFiles(dir);
        }
        catch { }

        if (files != null && files.Length > 0)
        {
          fileList.AddRange(files);
        }

        string[] folders = null;
        try
        {
          folders = Directory.GetDirectories(dir);
        }
        catch { }

        if (folders != null && folders.Length > 0)
        {
          foreach (string folder in folders)
          {
            queue.Enqueue(folder);
          }
        }
      }
    }
  }
}

请仔细对比下三种循环结构的写法,特别注意下里面有用到  if(true){...}   ,这种方式在某些编辑环境中可以产生非常美妙的效果。

相信本文所述对大家C#程序设计的学习有一定的借鉴价值。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux/Unix是如何避免硬盘碎片的
  • java自动根据文件内容的编码来读取避免乱码
  • 大家提供一个避免空指针操作的好方法?
  • 指教怎样避免空指针。。。
  • redhat7.3是不是有问题??为什么在拖动窗口的时候容易死机??怎么避免??
  • jquery防止重复执行动画避免页面混乱
  • 有潜在危险的 Request.Form 值避免方法
  • 打开窗口时如何避免自动切换到中文输入法?
  • unix-遍程基础:避免僵尸进程defunc的方法有那些?欢迎参与讨论
  • 我每次用emacs编辑文件后,总要生成一个副本,问怎么避免它
  • HELP~~~~~~JTREE里面如何避免重复的节点出现
  • 如何简单的避免程序的重复启动?
  • broken pipe是什么意思啊,如何避免阿?
  • 请问Killed系统错误是什么原因造成的?如何避免?
  • 从window上传到linux文件(覆盖同名文件),为什么文件的访问权限会变,怎么避免?
  • 取seesion当seesion为空是抛出异常?怎么避免?
  • 请问,在一个进程中创建多线程时如何能避免不同的线程获得同一个线程标识
  • 一个字符串分割来存到DB中的问题:如何避免一个汉字被从中间分割掉?
  • 请教如何避免不登录就直接访问一个jsp文件
  • sql语句中单引号嵌套问题(一定要避免直接嵌套)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3