For循环计数器始终在C#递归函数中重置

时间:2018-09-26 22:34:53

标签: c# .net

我有一个奇怪的问题,就是我没有完全了解它。希望有人能对此有所启发。

我在递归函数中有一个for循环,即使循环计数器是该类的实例变量,它也总是会重置。为什么?这是代码:

public class Products{
    private int loopCounter=1;
    private int loop=10;
    public int ProductCount {get;set;}
    public int GetProducts(int Take, int Skip)
    {
        //code that sets ProductCount is removed
        for (int loopCounter = 1; loopCounter < loop; loopCounter++)
        {
            //Depending on ProductCount, Take and Skip values are
            //computed and passed to GetProducts. This code removed for brevity and am hard coding them
            GetProducts(10,5);
            //code to process GetProducts output removed
        }
    } 
}

出于我不明白的原因,loopCounter总是重置为1,并且循环永远持续下去。循环不应该在10次迭代后停止吗?

4 个答案:

答案 0 :(得分:3)

每次调用该函数时,您都将在for循环的开头创建并设置新的方法级别变量loopCounter。如果要使用类级变量,则应删除for循环的第一部分(类似for(; loopCounter < loop; loopCounter++)

也就是说,我不建议使用循环来控制这样的递归。最好只使用一个循环,或者在遇到边界条件时让GetProducts返回。

public class Products{
private int loopCounter=1;
private int loop=10;
public int ProductCount {get;set;}
public int GetProducts(int Take, int Skip)
{
    if(loopCounter >= loop) return;
    loopCounter++;
    //code that sets ProductCount is removed
    //Depending on ProductCount, Take and Skip values are
    //computed and passed to GetProducts. This code removed for brevity and am hard coding them
    GetProducts(10,5);
    //code to process GetProducts output removed
} 

答案 1 :(得分:1)

我认为变量java.sql.*与全局变量不同,您每次调用该函数时都在创建一个新变量,请尝试从for循环中删除此变量:loopCounter。 / p>

答案 2 :(得分:0)

除了GetProducts()之外,我可能对循环中的实际内容有些困惑,但是似乎您没有停止的条件。从1开始运行一次循环,然后再次调用该函数,并创建一个从1开始的新循环。您需要创建一个条件来停止此无限调用机制,以便它将返回到已经存在的调用。

答案 3 :(得分:0)

如果你想返回递归函数调用的次数,或者换句话说就是计数,那么这个代码示例会有所帮助。

public class Products{
    
    public int GetProducts(int Take)
    {
        // Check if you are ready to return the count.

        if (/* Some condition to check. */)
        {
           // Returned value will be 0, if you don't call method
           // recursive, which is equivalent to counter == 0.

           return 0;
        }
        
        // Do some stuff here and get result.

        // Returned value will be 1 + next value of the Method
        // call, which is whether 0 or 1 if recursion goes further.
        // All together, the end value will be the count of
        // recursive method calls.

        return 1 + GetProducts(result);
    } 
}