标题:求大佬看看这个程序啊递归的我实在是看不懂了
只看楼主
Gloria_zhang
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2020-10-29
结帖率:71.43%
 问题点数:0 回复次数:3 
求大佬看看这个程序啊递归的我实在是看不懂了
求讲解
搜索更多相关主题的帖子: 讲解 递归 
2020-11-22 14:43
请输入密码
Rank: 2
等 级:论坛游民
威 望:5
帖 子:35
专家分:84
注 册:2020-11-19
得分:0 
一些没算法基础的人估计不了解此代码意思。
下次请直接把代码copy出来而不是图片。
并且附上该代码是用来干嘛的。

最后,请自行百度搜索C语言全排列代码讲解。

Bug易改,码风难移。
有事离开,无事灌水。
2020-11-22 18:08
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
递归的处理,关注一下递归的开始和结束
在程序执行过程中,发生了多次的函数的重入,但是有区别,即第三参数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编辑过]


剑栈风樯各苦辛,别时冰雪到时春
2020-11-22 18:55
请输入密码
Rank: 2
等 级:论坛游民
威 望:5
帖 子:35
专家分:84
注 册:2020-11-19
得分:0 
是这样的,我也解释一下吧。
把递归拆分一下。
第一轮递归展开完毕后。再从k=1开始执行下一轮。这时不要看前面做了些什么,只知道第一个数已经被处理掉就是了。
然后再从第二个数开始处理,也可以理解是一个全新的开始。只是k值加一而已。
不看前面做了些什么,只关注前一步与下一步的联系和递归约束条件,这就是递归的核心所在。
所以总结起来就是:把当前数与后面数挨个交换,而每次交换就是下一个数执行同一个过程的分支。

Bug易改,码风难移。
有事离开,无事灌水。
2020-11-22 20:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503967-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.162709 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved