• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#避免回溯方法心得

C#避免回溯方法心得

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了回溯法实验心得,回溯摄影工作室,c++走迷宫回溯算法,回溯,回溯法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了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<string> fileList1 = new List<string>();
      FunctionHuishuo(path, ref fileList1);

      List<string> fileList2 = new List<string>();
      FunctionQueue(path, ref fileList2);

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

    /// <summary>
    /// 回溯法
    /// </summary>
    /// <param name="path"></param>
    /// <param name="fileList"></param>
    private static void FunctionHuishuo(string path, ref List<string> 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);
          }
        }
      }
    }

    /// <summary>
    /// 堆栈法
    /// </summary>
    /// <param name="path"></param>
    private static void FunctionStack(string path, ref List<string> fileList)
    {
      Stack<string> stack = new Stack<string>();
      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);
          }
        }
      }
    }

    /// <summary>
    /// 队列法
    /// </summary>
    /// <param name="path"></param>
    private static void FunctionQueue(string path, ref List<string> fileList)
    {
      Queue<string> queue = new Queue<string>();

      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);
          }
        }
      }
    }
  }
}

</div>

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#避免回溯方法心得

相关文章

  • 2017-05-28C#使用SQLDMO操作数据库的方法
  • 2017-05-28C#进行文件读写、创建、复制、移动、删除的方法
  • 2017-05-28C#语法糖(Csharp Syntactic sugar)大汇总
  • 2017-05-28C# GDI在控件上绘图的方法
  • 2017-05-28C#创建安全的栈(Stack)存储结构
  • 2017-05-28c# winform读取xml文件创建菜单的代码
  • 2017-05-28C#实现HTML和UBB互相转换的方法
  • 2017-05-28C# 调用Delphi dll 实例代码
  • 2017-05-28C#中计时器的简单实现方法示例
  • 2017-05-28C#计算文件MD5校验的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#byte数组与Image的相互转换实例代码
    • C#利用WebClient实现两种方式下载文件
    • C#实现对二维数组排序的方法
    • C#中IList<T>与List<T>的区别深入解析
    • 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
    • 杂谈try-catch-finally异常处理
    • C#网络适配器简单操作
    • C#判断程序是否是管理员权限运行的方法代码示例
    • 比较2个datatable内容是否相同的方法
    • C#多线程处理多个队列数据的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有