方法结束,但编译器跳回
本文关键字:编译器 结束 方法 | 更新日期: 2023-09-27 17:49:02
只是为了好玩,我正在尝试做改变的问题-或多或少。我的问题是我得到了双倍的结果,通过使用调试器,我发现编译器即使在应该完成的时候也会再次跳转回方法。
private static void Main(string[] args)
{
string temp = Console.ReadLine();
int input;
if (int.TryParse(temp, out input))
{
if(input == 0)
{
System.Environment.Exit(Environment.ExitCode);
}
else
{
ChangeMaking(input);
}
}
else
{
Console.WriteLine("Not a number.");
}
}
private static int ChangeMakingHelper(int input, int euro)
{
return input / euro;
}
static int[] euro = { 1, 2, 5, 10, 20, 50, 100, 200, 500 };
static int counter = 0;
static List<int[]> result = new List<int[]>();
static int[] tempResult = new int[euro.Length];
private static void ChangeMaking(int input)
{
for (int i = euro.Length -1; i >= 0; i--)
{
if(euro[i] <= input)
{
tempResult[i] = ChangeMakingHelper(input, euro[i]);
input = input - euro[i];
if((input % euro[i] != 0))
{
ChangeMaking(input % euro[i]);
}
}
}
result.Add(tempResult);
}
例如,如果输入为11,则在For循环完成并将tempResult
添加到result
后,编译器跳转回这部分:
if((input % euro[i] != 0))
{
ChangeMaking(input % euro[i]);
}
我对输入11的预期行为将是一个具有此值的数组{1, 0, 0, 1, 0, 0, 0, 0, 0}
,我得到但翻倍。
问题是您正在使用静态变量在函数调用之间传递数据。不要那样做。使用返回值代替。
public static void Main()
{
var result = ChangeMaking(11);
Console.WriteLine(string.Join(", ", result));
}
private static int ChangeMakingHelper(int input, int euro)
{
return input / euro;
}
static readonly int[] euro = { 1, 2, 5, 10, 20, 50, 100, 200, 500 };
private static int[] ChangeMaking(int input)
{
var result = new int[euro.Length];
for (int i = euro.Length -1; i >= 0; i--)
{
if (euro[i] <= input)
{
result[i] += ChangeMakingHelper(input, euro[i]);
input = input - euro[i];
if (input % euro[i] != 0)
{
var tempResult = ChangeMaking(input % euro[i]);
// Transfer the results to the local result array
for(int j = 0; j < result.Length; j++)
result[j] += tempResult[j];
}
// Also add a break statement here so you don't add the lower values twice!
break;
}
}
return result;
}
小提琴:https://dotnetfiddle.net/7WnLWN
顺便说一下,你在输出中得到2个数组的原因是因为你递归地调用了ChangeMaking
,所以它被调用了两次,所以它调用了result.Add(tempResult)
两次。像我上面展示的那样去掉静态变量可以修复这个问题。
同样,可能有一种更有效的方法来做到这一点,而不是递归,但这将需要重新构建你的算法,所以我把这个留给你去弄清楚:)