地盘划分

地盘划分:此题是一个典型的递归算法,每一次都是按照行数与列数中较小的那一个来切割。

我的代码:

#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;
}
这样的话递归的次数会减少很多。

猜你喜欢

转载自blog.csdn.net/starlight321/article/details/79926446