地盘划分

这篇博客探讨了一个利用递归算法解决地盘划分的问题,重点在于如何正确设置递归出口并进行优化。错误的递归实现可能导致无限循环,正确的做法是确保递归有明确的返回条件,如能用行或列的较大值除以较小值,若能整除则结果为商,否则还需加上递归计算的余数部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

我的代码:

#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)
    {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值