2

我无法弄清楚为什么每次运行递归算法后都会更改一个完全不相关的变量。绝对没有我以任何方式为该变量分配新值的地方,但是递归方法仍然运行并且变量被更改。

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

递归算法旨在找到最佳的筹码序列。它制作了董事会的副本。将芯片添加到几个可能的位置之一(因此递归)。和递归。一旦达到基本情况,它就会找到芯片的假设配置将获得的“分数”。当它退出算法时,它会选择给出最多点的路径。

问题是电路板的原始副本不断被覆盖?该程序是这样的。(广义)

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”?我没有添加“参考”声明或任何东西,所以不应该保留原件吗?

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

谢谢你。

4

3 回答 3

3

If Boardis a classthenBoard TempBoard = OriginalBoard;是 C# 中的引用赋值,与 C++ 中它是值赋值不同,这就是为什么当您调用时Tempboard.MakeModification(x);更改了原始赋值。

考虑struct在赋值上使用 which 的行为类似于 C++ 类或创建一个新的临时对象。

于 2012-10-02T00:21:07.073 回答
1

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

Board TempBoard = OriginalBoard;

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

解决方案是创建Board一个结构,它是一个值类型,或者克隆你的板。由于在您的情况下使用 struct 很可能是一个坏主意,因此您应该考虑实施一种Clone方法,而不是:

Board TempBoard = OriginalBoard;

做:

Board TempBoard = OriginalBoard.Clone();
于 2012-10-02T00:23:21.537 回答
0

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

于 2012-10-02T00:23:39.573 回答