一个小学弟问了一个很简单的题目,是这样的
想把上面的改成递归,然后他尝试了一下这样写
然后我说不行,递归本就有循环的意思,在用循环不是多次一举,而且上面肯定运行不对的,
然后我告诉他递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
最简单的递归如这样:
所以递归的话在程序里肯定有if和else的结构,于是我这样改到
public static void Main()
{
int[] arry = new int[] { 1260, 1360 };
int i = 5300 / arry[1];//3
int j = 5300 / arry[0];//4
int sum = 0;
sum = LogicPut(i, j, sum, 0, 0);
Console.WriteLine("循环了" + sum);
}
public static int LogicPut(int i, int j, int sum, int n, int m)
{
if ((m * 1260 + n * 1360) <= 5300 && (m * 1260 + n * 1360) >= 5000)
{
Console.WriteLine("规格1260卷数" + m + "规格1360卷数" + n + "循环次数" + sum);
}
sum += 1;
if (m <=j-1)
{
m++;
LogicPut(i, j, sum, n, m);
}
if (n <= i-1 && m / j == 1)
{
n++;
m = 0;
LogicPut(i, j, sum, n, m);
}
return sum;
}
}
结果是
结果显然不对,最后调查发现在if条件里少了return 关键词,但sum为什么小了 ,查了一下return这个关键字,百度里:return; 直接作为一条语句表示当前函数(也可以叫做方法)结束
return后有东西,则是返回和函数返回类型一致的对象。
所以sum这个变量变小是和堆栈有关系的,详见转:C# 深入理解堆栈、堆在内存中的实现 - Jearay - 博客园 (cnblogs.com)。第一次看到这种现象,所以记录一下。下面是正确代码:
public static void Main()
{
int[] arry = new int[] { 1260, 1360 };
int i = 5300 / arry[1];//3
int j = 5300 / arry[0];//4
int sum = 0;
sum = LogicPut(i, j, sum, 0, 0);
Console.WriteLine("循环了" + sum);
}
public static int LogicPut(int i, int j, int sum, int n, int m)
{
if ((m * 1260 + n * 1360) <= 5300 && (m * 1260 + n * 1360) >= 5000)
{
Console.WriteLine("规格1260卷数" + m + "规格1360卷数" + n + "循环次数" + sum);
}
sum += 1;
if (m <=j-1)
{
m++;
return LogicPut(i, j, sum, n, m);
}
if (n <= i-1 && m / j == 1)
{
n++;
m = 0;
return LogicPut(i, j, sum, n, m);
}
return sum;
}
运行结果: