地盘划分:此题是一个典型的递归算法,每一次都是按照行数与列数中较小的那一个来切割。
我的代码:
#include<stdio.h>
void work(int n, int m, int sum)
{
if(n > m)
{
work(n - m, m, sum + 1);
}
else if(n < m)
{
work(n, m - n, sum + 1);
}
else
{
printf("%d\n", sum + 1); //第一次错误的地方,写成了work(n, m, sum + 1)。这种写法将会导致递归永远无出口。
}
return;
}
int main(void)
{
int n, m, sum = 0;
scanf("%d%d", &n, &m);
work(n, m, sum);
return 0;
}
错误原因:
1: 递归是需要出口的。出口必须是“输出”或者是return XX。如果每一种情况都写成work(n, m, sum + 1),就会导致无限的递归。。
此题还可以对递归进行优化:用行或者列中较大的那一个除以较小的那一个:若能除尽,则商就是结果;不然就用商加上(除数与余数的递归)。
#include<stdio.h>
int work(int i, int j)
{
int s1, s2;
if(i == j)
{
return 1;
}
else if (i < j)
{
s1 = i;
s2 = j;
}
else
{
s1 = j;
s2 = i;
}
if(s2 % s1 == 0)
{
return s2 / s1;
}
else
{
return work(s1, s2 % s1) + s2 / s1;
}
}
int main(void)
{
int n, m;
scanf("%d%d", &n, &m);
printf("%d\n", work(n, m));
return 0;
}
这样的话递归的次数会减少很多。