难以理解递归难题

时间:2016-02-04 10:42:34

标签: c++ recursion

我正在尝试打印导致答案的步骤,但没有到达任何地方。请参考此图片:

enter image description here

我能够检查给定的问题是否可以解决:

bool Solvable(int a[], int index, int target, int sz, int b[]) {
    static int b_ind = 0;
    if (target == 0 && index == sz-1)
        return true;
    if (index >= sz || index < 0)
        return false;
    int u_ind = index+a[index];
    int d_ind = index-a[index];
    bool u_y = Solvable(a,u_ind,a[u_ind],sz,b);
    if (u_y) {
        b[b_ind++] = u_ind;
        return u_y; }
    else {
        bool d_y = Solvable(a,d_ind,a[d_ind],sz,b);
        if (d_y) {
            b[b_ind++] = d_ind;
            return d_y; }
    }
}

但是无法打印为正确解决方案而访问的索引序列。

2 个答案:

答案 0 :(得分:0)

要做的两件事:

  1. 达到您的标准时,例如if (target == 0 && index == sz-1),显示b变量。 b是您存储探索路径的地方吗?
  2. 当Solvable(...)返回false时,您必须递减b_ind
  3. 注意:您的代码有点可疑,因为上一个if没有任何其他内容;这是缺失的:

            if (d_y) {
                b[b_ind++] = d_ind;
                return d_y;
            } /* the following block is missing */
            else 
            {
                b_ind--;
                return false;
            }
    

答案 1 :(得分:0)

您无法在途中打印索引,因为您事先并不知道是否会找到解决方案。所以你需要做的是,在你的递归调用中,传递一个列表(&#34;路径&#34;)的访问位置。确保您不会更改现有路径,但实际上是在创建副本。

此外,您可能希望在找到第一个解决方案之后继续搜索,有时候不止一个。

一个问题是你可能会根据输入的谜题永远循环。这就是为什么拥有路径实际上有益的原因,因为它允许您检测循环。

在可执行的伪代码(他们称之为Python)中,它就像:

def puzzle(lst):
    def solve(pos, path):
        if 0 <= pos < length:   # position is inside puzzle
            if pos not in path: # we've already been here; prevent looping
                val = lst[pos]
                newpath = path + [pos] # newpath is a *copy* of path with pos appended
                if val == 0:    # we've found one solution
                    print(newpath)
                else:
                    solve(pos-val, newpath)
                    solve(pos+val, newpath)
    length = len(lst)
    solve(0, [])

puzzle([3, 6, 4, 1, 3, 4, 2, 5, 3, 0])

对于您的示例,这会产生:

[0, 3, 2, 6, 8, 5, 9]
[0, 3, 4, 1, 7, 2, 6, 8, 5, 9]
[0, 3, 4, 7, 2, 6, 8, 5, 9]