2501_90771931 2025-02-22 23:59 采纳率: 0%
浏览 11

c++函数递归中循环次数被改变?

img

img

#include<iostream>
using namespace std;

int xadd[2] = { 1,0 };
int yadd[2] = { 0,1 };
int way[20][20] = { 0 };
int sum = 0;

struct horse 
{
    int x[9] = { 0,-1,-2,-2,-1,1,2,2,1 };
    int y[9] = { 0,-2,-1,1,2,-2,-1,1,2 };
    int place[9][2];
};

void horseplace(struct horse*h,int a,int b)
{
    for (int i = 0; i < 9; i++)
    {
        h->place[i][0] = a + h->x[i];
        h->place[i][1] = b + h->y[i];
    }
}

int isin(int x, int y,int n,int m,struct horse* h)
{
    if (x<0 || x>n || y<0 || y>m
        || x == h->place[0][0] && y == h->place[0][1]
        || x == h->place[1][0] && y == h->place[1][1]
        || x == h->place[2][0] && y == h->place[2][1]
        || x == h->place[3][0] && y == h->place[3][1]
        || x == h->place[4][0] && y == h->place[4][1]
        || x == h->place[5][0] && y == h->place[5][1]
        || x == h->place[6][0] && y == h->place[6][1]
        || x == h->place[7][0] && y == h->place[7][1]
        || x == h->place[8][0] && y == h->place[8][1])
        return 0;
    else
        return 1;
}

int num(struct horse* h, int n, int m,int a=0,int b=0)
{
    int c, d, k;

    for (k = 0; k < 2;++k)
    {
        c=a + xadd[k];
        d=b + yadd[k];
        if (isin(c, d, n, m, h))
        {
            a = c;
            b = d;
            if (a == n && b == m)
            {
                sum++;
            }
            else
            {
                num(h, n, m, a, b);
            }
        }
    }
    return sum;
}

int main()
{
    struct horse h;
    int a, b, n, m;

    cin >> n >> m >> a >> b;

    horseplace(&h, a, b);

    int g = num(&h, n, m);

    cout << g << endl;

    system("pause");

    return 0;
}

我找到的问题是在函数int num(struct horse* h, int n, int m,int a=0,int b=0)的for循环部分,
按照样例输入“6 6 3 3”,第一次到达终点是先往下走再往右走,然后逐个退出递归。但是在(6,0)位置时,for循环的k值本应该是1,退出递归到(6,0)时却变成了0,导致多计算了一次路径。请帮我找找原因,谢谢!

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-02-22 23:59
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你遇到了一个有趣的问题!在 C++ 中,函数递归中循环次数被改变是因为函数调用栈的原因。

    在你的代码中,你定义了两个数组 xaddyadd,它们用于表示递归函数的状态。然而,在递归函数中,你没有正确地使用这些数组来记录状态。

    在递归函数中,每次调用都会创建一个新的栈帧,用于存储函数的局部变量和参数。这些栈帧会被销毁当函数返回时。因此,如果你不正确地使用这些数组,可能会导致循环次数被改变。

    解决方案是使用递归函数的参数来记录状态,而不是使用全局变量。例如,你可以使用一个参数 int state 来记录当前的状态,然后在递归函数中更新这个参数。

    以下是一个简单的示例代码:

    int xadd(int state) {
        if (state == 0) {
            return 1;
        } else {
            return 0;
        }
    }
    
    int yadd(int state) {
        if (state == 0) {
            return 0;
        } else {
            return 1;
        }
    }
    
    int w(int state) {
        if (state == 0) {
            return xadd(1);
        } else {
            return yadd(0);
        }
    }
    

    在这个示例代码中,我们使用了递归函数的参数 state 来记录当前的状态。这样可以避免循环次数被改变的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月22日