如果我在函数顶部切换注释行的位置,为啥我的代码不起作用?这是一个记忆召回声明[关闭]

Posted

技术标签:

【中文标题】如果我在函数顶部切换注释行的位置,为啥我的代码不起作用?这是一个记忆召回声明[关闭]【英文标题】:Why does my code not work if I switch the position of commented line on top of the function? It's a memoization recall statement [closed]如果我在函数顶部切换注释行的位置,为什么我的代码不起作用?这是一个记忆召回声明[关闭] 【发布时间】:2021-12-20 00:08:50 【问题描述】:

我正在尝试记住这个独特的路径网格问题。直到现在,我总是将记忆化的 return 语句放在函数的顶部。但在这里,它不起作用。我不明白为什么。

这些职位有时重要吗?你能解释一下原因吗?

我刚刚开始动态编程。

int grid(long long i, long long j, long long m, long long n, vector<vector<long long>> &memo) 
    if (memo[i][j] != -1) return memo[i][j]; // but not working here, WHY??
    if (i == m - 1 && j == n - 1) return 1; 
    if (i >= m || j >= n) return 0;
    // if (memo[i][j] != -1) return memo[i][j]; // works here
    memo[i][j] = grid(i + 1, j, m, n, memo) + grid(i, j + 1, m, n, memo);
    return memo[i][j];

【问题讨论】:

mn 应该是二维向量memo 的维度吗?在这种情况下,您确实首先需要if (i &gt;= m || j &gt;= n) return 0;,这样当i,j 超出范围时,您就不会尝试越界访问。 准确定义“不工作”。你期待什么行为,而你观察的是什么?另外,您在哪里以及如何为memo 向量分配内存?你不能索引到不存在的内存。 C++ 中的语句不会神奇地一下子发生。更改函数中语句的顺序通常会更改某些操作集的顺序。以不同的顺序执行一组操作可以改变净效果,特别是如果一个操作的结果被后续操作使用。所以,是的,在其他语句中更改语句的“位置”可以改变函数是否“有效”。你没有指定“工作”的标准,也没有描述输入是什么,所以没人能猜出原因。 【参考方案1】:
int grid(long long i, long long j, long long m, long long n, vector<vector<long long>> &memo) 
    // delete the first statement
    if (i == m - 1 && j == n - 1) return 1; 
    if (i >= m || j >= n) return 0;
    if (memo[i][j] != -1) return memo[i][j];
    memo[i][j] = grid(i + 1, j, m, n, memo) + grid(i, j + 1, m, n, memo);
    return memo[i][j];

在这里,您首先检查if (i &gt;= m || j &gt;= n),以防止出现越界错误,然后再尝试访问memo[i][j];

但是:

int grid(long long i, long long j, long long m, long long n, vector<vector<long long>> &memo) 
    if (memo[i][j] != -1) return memo[i][j]; 
    if (i == m - 1 && j == n - 1) return 1; 
    if (i >= m || j >= n) return 0;
    // delete the second statement
    memo[i][j] = grid(i + 1, j, m, n, memo) + grid(i, j + 1, m, n, memo);
    return memo[i][j];

在这里,您首先尝试访问memo[i][j];,然后再检查if (i &gt;= m || j &gt;= n) return 0;,因此这里可能会发生越界错误,并且您会得到未定义的行为

【讨论】:

以上是关于如果我在函数顶部切换注释行的位置,为啥我的代码不起作用?这是一个记忆召回声明[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

当我在 plotly 中使用 ggplotly 函数时,为啥文本注释会丢失?

为啥当我遍历位置时地理定位不起作用

为啥是我的标头(“位置:$_SERVER['HTTP_REFERER']”); PHP函数不起作用?

为啥我的频道消息发送代码不起作用?

为啥我的列表视图上的删除按钮不起作用[重复]

为啥这个循环不起作用?