我无法弄清楚每次运行递归算法后,为什么完全不相关的变量会发生变化。绝对没有任何地方我可以以任何方式为此变量赋值,但仍然会运行递归方法并更改变量。
我写的程序是连接四。它有一个“棋盘”对象,用于存储玩家筹码所在的位置,以及一种评估该人可以获得多少可能连接四个角色的方法,并为该配置分配一个分数。
递归算法旨在找到最佳的芯片序列。它制作了一份董事会副本。将芯片添加到几个可能位置之一(因此递归)。并且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中,在原始板对象被修改的当前未知时刻以某种方式断点吗?
谢谢。
答案 0 :(得分:3)
如果Board
是class
,那么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中改变,因为它们都指的是同一个东西。结构是值类型,类是引用类型,这意味着如果以相同的方式传入结构,它将不会像此对象那样更改。