我有一个奇怪的问题,就是我没有完全了解它。希望有人能对此有所启发。
我在递归函数中有一个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次迭代后停止吗?
答案 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);
}
}