这个递归(dfs)如何转为goto来处理?

下面代码是dfs递归生产全排列的,想了解一下改成goto应该如何实现,尝试了一下总有些问题


#include <stdio.h>
#define N 3
int count = 0, A[N], vis[N];
void dfs(int level) {
    if (level == N) {
        count++;
        for (int j = 0; j < N; ++j) {
            printf("%d ", A[j]);
        }
        puts("");
    } else
        for (int i = 0; i < N; i++) {
            if (vis[i] == 0) {
                vis[i] = 1, A[level] = i;
                dfs(level + 1);
                vis[i] = 0;
            }
        }
}
int main() {
    dfs(0);
}
阅读 1.8k
1 个回答

start是递归深入的入口。end是回溯时的入口。

#include <stdio.h>
#define N 4
int count = 0, A[N], vis[N], I[N];

void dfs(int level) {
start:
  if (level == N) {
    count++;
    for (int j = 0; j < N; ++j)
      printf("%d ", A[j]);
    puts("");

    --level;
    goto end;
  }

  for (; I[level] < N; I[level]++) {
    if (vis[I[level]] == 0) {
      vis[I[level]] = 1, A[level] = I[level];
      ++level;
      goto start;
end:
      vis[I[level]] = 0;
    }
  }

  I[level] = 0;
  --level;
  if (level < 0)
    return;
  goto end;
}

int main()
{
  dfs(0);
  return 0;
}

递归改迭代需要保存每层栈的局部变量,将函数按回溯拆分,手动模拟压栈和弹栈。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题