递归算法后,变量神秘地不断变化

时间:2012-10-02 00:18:12

标签: c# recursion

我无法弄清楚每次运行递归算法后,为什么完全不相关的变量会发生变化。绝对没有任何地方我可以以任何方式为此变量赋值,但仍然会运行递归方法并更改变量。

我写的程序是连接四。它有一个“棋盘”对象,用于存储玩家筹码所在的位置,以及一种评估该人可以获得多少可能连接四个角色的方法,并为该配置分配一个分数。

递归算法旨在找到最佳的芯片序列。它制作了一份董事会副本。将芯片添加到几个可能位置之一(因此递归)。并且Recurses。一旦到达基础案例,它就会找到芯片的假设配置将会收到的“得分”。当它退出算法时,它会选择给出greates点数的路径。

问题是该主板的原件是否一直被覆盖?程序就是这样的。 (广义)

int[] FindBestPath(Board OrginalBoard, int Depth)
{
  Board TempBoard = OriginalBoard;
  if(Depth > 0)
    for(x of many possible modifications)
    {
      Tempboard.MakeModification(x);
      Depth--;
      Score = FindBestPath(TempBoard, Depth);
      if(Score > highestScoreYet)
      {
           highestScoreYet = Score;
           BestModification = x;
      }
    }
  else if(Depth == 0)
    Return new int[2] {ConfigurationScore(TempBoard), -1};

  return new int[2] {HighestScoreYet, BestModification};
}

为什么我实际调用递归算法时传递的'原始板'会以各种可能的方式修改'x'?我没有添加'ref'语句或其他任何内容,所以不应保留原始文件吗?

对象行为和递归算法是否有一些已知的奇怪之处?我可以在Microsoft C#Express 2010中,在原始板对象被修改的当前未知时刻以某种方式断点吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

如果Boardclass,那么Board TempBoard = OriginalBoard;是C#中的引用分配,与C ++中的引用分配不同,这是一个值赋值,这就是为什么当你调用Tempboard.MakeModification(x);时你有原创一个改变了。

考虑使用struct,其行为类似于C ++类的赋值或创建新的临时对象。

答案 1 :(得分:1)

这里的罪魁祸首是Board是一个类,一个引用类型。当你这样做时:

Board TempBoard = OriginalBoard;

你没有得到董事会的副本。你得到了对同一块板的引用。

解决方案是使Board为结构,这是一种值类型,或克隆您的电路板。因为在你的情况下使用struct很可能是一个坏主意,你应该考虑实现Clone方法,而不是:

Board TempBoard = OriginalBoard;

做的:

Board TempBoard = OriginalBoard.Clone();

答案 2 :(得分:0)

你正在使TempBoard等于OriginalBoard,这意味着他们拥有相同的参考。你可以用与C中指针相同的方式来考虑它。所以你在TempBoard中改变的任何东西都会在OriginalBoard中改变,因为它们都指的是同一个东西。结构是值类型,类是引用类型,这意味着如果以相同的方式传入结构,它将不会像此对象那样更改。