到达方法结束但编译器跳回来

时间:2015-05-14 22:44:03

标签: c#

只是为了好玩我试图做出改变制造问题 - 或多或少。我的问题是我获得了双倍的结果并且通过使用调试器我发现编译器甚至在它应该完成时再次跳回到该方法。

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}的数组,但我得到的却加倍了。

1 个答案:

答案 0 :(得分:2)

问题是您使用静态变量在函数调用之间传递数据。不要那样做。改为使用返回值。

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)两次。如上所示,摆脱静态变量可以解决这个问题。

此外,有一种更有效的方法可以在没有递归的情况下完成此操作,但这需要重新调整算法,所以我会留给你弄清楚:)