注册 登录
编程论坛 C语言论坛

求大佬看看这个程序啊递归的我实在是看不懂了

Gloria_zhang 发布于 2020-11-22 14:43, 1455 次点击
只有本站会员才能查看附件,请 登录
求讲解
3 回复
#2
请输入密码2020-11-22 18:08
一些没算法基础的人估计不了解此代码意思。
下次请直接把代码copy出来而不是图片。
并且附上该代码是用来干嘛的。

最后,请自行百度搜索C语言全排列代码讲解。
#3
林月儿2020-11-22 18:55
递归的处理,关注一下递归的开始和结束
在程序执行过程中,发生了多次的函数的重入,但是有区别,即第三参数k在变化
这个变化会触发第一个判断(收敛条件)的成立,导致递归结束

这里的场景比较复杂,树形结构的递归
123数组,第二个for循环语句将上一层进来的程序分成多个执行流
做的事情就是交换数组元素内容,交换的位置为i和n
执行完再换回来(从上下文看确实是可逆处理)

123(123,213,321)这是第一轮的变化,此时k为0
接着这多个场景分三条支线走第二层,此时k为1
123(123,213,321)
213(213,123,312)
321(321,231,123)
下面在依次对这九个场景继续执行交换流程,此时k为2,与n相等,再进下一轮就到了结束的条件
那么按理说应该打印9乘以3有27条,结果却是6条
是因为上面分析有错误,即每一轮的开始交换位置是从k开始,而不是从0

故上面列的k为1变化应该是
123(123,132)
213(213,231)
321(321,312)
第一个元素不参与变化位置


最后一轮k为2的次数也会“缩水”为1,基于上面的6个分支结果为
123 132 213 231 321 312

嗯,可以按自己的方式去解读,不用怕错,大胆推论小心论证
注意执行流程细节,变化的点

[此贴子已经被作者于2020-11-22 18:57编辑过]

#4
请输入密码2020-11-22 20:03
是这样的,我也解释一下吧。
把递归拆分一下。
第一轮递归展开完毕后。再从k=1开始执行下一轮。这时不要看前面做了些什么,只知道第一个数已经被处理掉就是了。
然后再从第二个数开始处理,也可以理解是一个全新的开始。只是k值加一而已。
不看前面做了些什么,只关注前一步与下一步的联系和递归约束条件,这就是递归的核心所在。
所以总结起来就是:把当前数与后面数挨个交换,而每次交换就是下一个数执行同一个过程的分支。
1