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

发布于 2022-09-13 00:24:27 字数 543 浏览 17 评论 0

下面代码是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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩世 2022-09-20 00:24:27

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;
}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文