c++ - 递归问题求助C++

标签 c++ algorithm recursion puzzle

我正在尝试编写代码来检查您是否可以按照特定规则到达数组的末尾。您从整数数组的第一个元素开始,存储在该位置的数字就是您可以向前或向后跳跃的次数。目标是到达由 0 值表示的 Vector 的末尾。

 bool Solvable(int start, Vector<int> & squares) {
        int steps = squares[start];
        int prev = start - steps;
        int forward = start + steps;
        if (prev >= 0) {
            if (squares[prev] != squares[start]) {
                return Solvable(prev, squares);
            }
        }
        if (forward < squares.size()) {
            if (squares[forward] == 0) return true;
            if (squares[forward] != squares[start]) {
                return Solvable(forward, squares);
            }
        }
        return false;
    } 

代码似乎不起作用,因为我认为我缺少一个基本案例,但我似乎无法弄清楚我还需要什么其他基本案例。

谢谢!

最佳答案

有几个问题。首先是你的代码只会选择前进或后退,你永远不会选择两者。原因是你总是说return Solvable。你需要的是这样的东西

// try backwards
bool found = Solvable(prev, squares);
// did it work?
if (found)
  return true;
// oh well try forwards
return Solvable(forward, squares);

这里没有检查基本情况,也没有检查越界,但希望您明白了。

第二个问题是您的 squares[forward] != squares[start]squares[prev] != squares[start] 测试。在我看来,它们并不是您所描述的问题的一部分。我会放弃它们。

说明递归的好问题。

关于c++ - 递归问题求助C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088077/

相关文章:

java - 使用优先级队列的 Prims 算法的复杂性?

python - 在python中递归地从树中删除项目

c++ - 为什么我仍然可以访问已移动的对象?

c++ - IRLBot Paper DRUM 实现 - 为什么将键、值对和辅助存储桶分开?

c++ - 具有std::function的std::shared_ptr作为自定义删除器和分配器

algorithm - 将任意长度的位向量压缩/散列到定义的长度

c++ - 超轻型 gzip 压缩实现?

c++ - 8 Queens Variation-排列数回溯实现-错误输出

powershell - 如何递归获取PowerShell中自定义输出中所有文件和文件夹的大小

javascript - 加速 JavaScript 中的递归函数