递归问题帮助c++

Recursion problem help C++

本文关键字:c++ 帮助 问题 递归      更新时间:2023-10-16

我正试图编写代码来检查您是否可以通过遵循一定的规则到达数组的末尾。你从整数数组的第一个元素开始,存储在这个位置上的数字就是你可以向前或向后跳多少次。目标是到达由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]测试。在我看来,它们并不像你描述的那样是问题的一部分。我会把它们扔掉。

说明递归的好问题。

这里有一个版本可以检测循环并跟踪你是否尝试过从特定的正方形向前或向后移动。使用具有非递归前端的递归辅助函数来设置变量(这里是fwdbck向量)以跟踪您正在执行的操作的模式非常常见。

#include <iostream>
#include <vector>
using namespace std;
bool helper(int cur, const vector<int> &squares,
            vector<bool> &fwd, vector<bool> &bck)
{
  cout << "cur=" << cur << "  sq=" << squares[cur] << endl;
  if (squares[cur] == 0) return true;     // Found.
  if (fwd[cur] && bck[cur]) return false; // Cycle.
  if (!fwd[cur]) {                        // Try forwards.
    fwd[cur] = true;
    int up = cur + squares[cur];
    if (up < squares.size()) {
      cout << "Forwards" << endl;
      bool found = helper(up, squares, fwd, bck);
      if (found) return true;
    }
  }
  if (!bck[cur]) {                        // Try backwards.
    bck[cur] = true;
    int dn = cur - squares[cur];
    if (dn >= 0) {
      cout << "Backwards" << endl;
      bool found = helper(dn, squares, fwd, bck);
      if (found) return true;
    }
  }
  return false;
}
bool solvable(const vector<int> &squares)
{
  vector<bool> fwd(squares.size(), false);
  vector<bool> bck(squares.size(), false);
  return helper(0, squares, fwd, bck);
}
int sqs[] = { 2, 3, 1, 1, 4, 3, 4, 0, 1, 3, 1 };
int main(void)
{
  vector<int> sq(sqs, sqs + sizeof(sqs) / sizeof(int));
  cout << solvable(sq) << endl;
}