了解递归以生成排列

2023-11-30

我发现递归,除了像阶乘这样非常直接的递归之外,非常难以理解。以下代码片段打印字符串的所有排列。谁能帮我理解一下。如何正确理解递归?

void permute(char a[], int i, int n)
{
   int j;
   if (i == n)
     cout << a << endl;
   else
   {
       for (j = i; j <= n; j++)
       {
          swap(a[i], a[j]);          
          permute(a, i+1, n);
          swap(a[i], a[j]);
       }
   }
} 

int main()
{
   char a[] = "ABCD";
   permute(a, 0, 3);
   getchar();
   return 0;
}

PaulR 有正确的建议。您必须“手动”运行代码(使用您想要的任何工具 - 调试器、纸张、在某些点记录函数调用和变量),直到您理解它。对于代码的解释,我将推荐您参考 quasiverse 的优秀答案。

Perhaps this visualization of the call graph with a slightly smaller string makes it more obvious how it works: Call graph

该图是用graphviz.

// x.dot
// dot x.dot -Tpng -o x.png
digraph x {
rankdir=LR
size="16,10"

node [label="permute(\"ABC\", 0, 2)"] n0;
 node [label="permute(\"ABC\", 1, 2)"] n1;
  node [label="permute(\"ABC\", 2, 2)"] n2;
  node [label="permute(\"ACB\", 2, 2)"] n3;
 node [label="permute(\"BAC\", 1, 2)"] n4;
  node [label="permute(\"BAC\", 2, 2)"] n5;
  node [label="permute(\"BCA\", 2, 2)"] n6;
 node [label="permute(\"CBA\", 1, 2)"] n7;
  node [label="permute(\"CBA\", 2, 2)"] n8;
  node [label="permute(\"CAB\", 2, 2)"] n9;

n0 -> n1 [label="swap(0, 0)"];
n0 -> n4 [label="swap(0, 1)"];
n0 -> n7 [label="swap(0, 2)"];

n1 -> n2 [label="swap(1, 1)"];
n1 -> n3 [label="swap(1, 2)"];

n4 -> n5 [label="swap(1, 1)"];
n4 -> n6 [label="swap(1, 2)"];

n7 -> n8 [label="swap(1, 1)"];
n7 -> n9 [label="swap(1, 2)"];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解递归以生成排列 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 将 Task 类型保存到 String 会导致灾难性失败

    我正在尝试将我在 Canvas 上编写的 Ink 保存在一个类中 并使用在此找到的这两种方法重新加载它link private async Task
  • 如何在 Visual Studio C89 中按照其他代码声明可变长度数组 [重复]

    这个问题在这里已经有答案了 我知道在 VS 中所有变量都必须在块的顶部声明 但是如果我想要一个 VLA 即 如果我想做这样的事情 int result runalgorithm int vla result 上面的代码无效 因为vla必须在
  • 使用 CGridView、Yii 在 BELONGS_TO 模型列中搜索

    我有一个用于课程模型的 CGridView 小部件 this gt widget zii widgets grid CGridView array id gt lesson grid dataProvider gt model gt sea
  • 使用 SFML 库构建 CMake 项目

    我不明白如何使用构建 SFML 项目CMakeLists txt file 如果你有时间的话 请帮帮我 谢谢你 Details 我从官方网站下载了 SFML 库 https www sfml dev org index php 将其移至我的
  • 在 Windows 10 上使用 Python 关闭 WiFi?

    我一直在寻找一种使用脚本打开和关闭 wifi 的方法 我认为这可以通过进入飞行模式或其他方法来完成 当我在谷歌上搜索答案时 我找不到任何对 Windows 有用的东西 只找到 Android 甚至 macOS 的东西 有人有 2 个功能吗
  • 访问保存在类路径中的 Microsoft Access 数据库

    我正在尝试访问存储在类路径中的数据库 我已经安装了 ucanaccess 3 0 0 和所有必需的 jar 我的项目层次结构 这是我到目前为止的代码 public void login Connection conn try conn Dr
  • 是否可以仅为 d3 js 中树布局的子节点到子节点绘制虚线链接

    是否可以只为子节点到子子节点绘制虚线链接 父节点到其子节点应该是常规的连续链接 a b gt dashed links c d gt continues links a 有可能的 看看这个直播example 截图在这里 我创建了两种样式 一
  • 从数据帧的所有单元格值中删除前缀

    我有一个 pandas 数据框 如下所示 col1 col2 col3 field1 index1 value1 field2 index2 value2 field3 index3 value3 field1 index4 value4
  • 绕过 Delphi 7 中的 OutputDebugString?

    我想知道是否可以绕过 OutputDebugString 我希望 OutputDebugString 输出显示在 DebugView 中 而不是显示在内部 Delphi 事件查看器窗口中 但我找不到一种方法来告诉 Delphi 不要吞下 O
  • Payum Paypal Rest config_path

    我正在尝试使用 symfony 3 1 4 中的 payum 包来实现 paypal rest 支付 我需要在我的 Symfony 应用程序中运行 PayPal Plus 因此我读了这篇文章https github com Payum Pa
  • Restful PUT 方法的 ModelAttribute 未填充值 ( JSON )

    我正在使用 Spring MVC 构建一个完全安静的 Web 应用程序 当我有 PUT 方法时 我的 ModelAttribute 表单 bean 未填充 所有值均为 null 如果我使用 POST 方法 所有内容都会正确填充 我用 Pos
  • CMake - set_property 找不到 CACHE 变量

    免责声明 我知道this问题 然而 OP 的需求与我的不同 他真正想要的是将应用程序移植到 Linux 因此答案就在那一行 而不是回答我想知道的 错误的原因 我正在尝试按照中的说明在 CMake GUI 中创建一个下拉列表here and
  • 尝试在 C shell 中实现管道挂起并且未运行命令

    我正在尝试运行这个命令ps j more 我认为我已经正确设置了管道 但由于某种原因它只是挂起 我正在调用一个正在运行的 forkps j和第二个运行的叉子more并用管道将它们连接起来 由于某种原因 这仍然没有按预期工作 代码如下 def
  • 如何在 R 中使用 GenSA 函数进行数学约束

    我目前正在尝试使用模拟退火包 GenSA 来最小化以下功能 efficientFunction lt function v t v Cov Mat v 其中 Cov Mat 是从 4 个资产获得的协方差矩阵 v 是维度 4 的权重向量 我正
  • 通过在另一列中出现多个值来过滤组[重复]

    这个问题在这里已经有答案了 如同这个问题但又增加了皱纹 我想仅过滤在组的任何行的特定列中同时具有两个 或全部多个 值的行组 例如 假设我有这个数据框 df lt data frame Group LETTERS c 1 1 1 2 2 2
  • 当我关闭灯箱时停止播放视频

    我用这个建立了一个弹出窗口article看起来真的很好 这是我所做的
  • OpenCV 中的连接组件

    我正在寻找一个 OpenCV 函数 它可以找到连接的组件并对其执行一些任务 例如获取对象中的像素数 轮廓 像素列表等 OpenCV C 有没有类似于MatLab的regionprops的函数 从3 0版本开始 OpenCV有connecte
  • 不使用 sklearn 从数据构建混淆矩阵

    我正在尝试在不使用 sklearn 库的情况下构建混淆矩阵 我无法正确形成混淆矩阵 这是我的代码 def comp confmat currentDataClass 1 3 3 2 5 5 3 2 1 4 3 2 1 1 2 predict
  • 将值从一个对象复制到另一个对象(不同类型)

    我需要将一个对象的某些属性复制到另一个对象 但是 某些属性需要从十进制到整数的类型转换 我发现这个问题非常有用 将值从一个对象复制到另一个对象 但是 我不知道如何修改 Jon Skeet 和 Marc Gravell 的 MiscUtil
  • 了解递归以生成排列

    我发现递归 除了像阶乘这样非常直接的递归之外 非常难以理解 以下代码片段打印字符串的所有排列 谁能帮我理解一下 如何正确理解递归 void permute char a int i int n int j if i n cout lt lt