搜索
当前位置: 678彩票官网 > 递归例程 >

求大神解答一个简单的C++递归程序问题

gecimao 发表于 2019-04-18 14:22 | 查看: | 回复:

  程序如下:希望大神帮忙讲解下perm这个函数的递归思想,这里没注释,我个人递归的理解能力也比较差,希望大神们能帮忙看一下,也就几行代码而已,不胜感激#includeiostreamusingnam...

  程序如下:希望大神帮忙讲解下perm这个函数的递归思想,这里没注释,我个人递归的理解能力也比较差,希望大神们能帮忙看一下,也就几行代码而已,不胜感激

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  排列还比较好理解。可以想象我们手动进行排列,比如对于1,2,3这个序列,我们要输出它的所有排列,那么正常情况下我们怎么做这个排列呢?

  我们肯定是先在这个序列中选出一个数,之后再在剩余的序列中继续选,直到最后一个数(此时我们不用选了,因为只有一个数)。

  那么对于1,2,3这个序列,我们假定有一个列表L存放我们排列的元素,我们可以

  注意,我们可以这么考虑上面的过程:总是在剩余的序列中选择一个整数。这样,对于第一步而言,剩余的序列其实就是整个序列。

  这个表示我要对第k到第m-1个元素之间进行排列,而对于第0到第k-1个元素其实就是排列好的。

  1中其实做的就是在剩余序列(这里是第k到第m-1个元素)中选出一个元素,即第i个元素,并放到我们上面讲的L中。由于这里我们直接利用list来存取这个元素,所以我们将第i个元素存放到list末尾,而注意到list中第0到第k-1个元素是排列好的,那么就只能将第i个元素放到k的位置,这样就代表插入到末尾了。由于我们将第i个元素挖掉了,但是我们前面将选出的第i个元素放到了第k的位置,那么将原来第k个元素放到第i位置不就代表[k+1,m)个元素组成了剩余序列嘛。

  (每次循环代表一次排列,而1其实是顺序选出这些元素。第一次循环我们选择第k个元素,即剩余序列中的第一个,第二次,选择第k+1个,即剩余序列的第二个,依次类推。)

  按照上面对Perm的定义,2其实是对剩余序列做排列,这里剩余序列是k+1到m-1个元素,因为k已经作为这次循环选择的元素。

  3是为了进行下一次排列做准备。我们在循环中在序列[k..m)中选择了第i个元素,那么下次我们就要在这原来的[k..m)的序列中选择第i+1个元素,为了将剩余序列恢复,并且由于我们上一次循环将第i个元素放到了第k个的位置,所以在一次交换就变回来了。

  最后的输出根据对排列的描述也就容易理解了,因为只剩下一个元素,所以我们认为排列结束,所以就直接输出了。

  能不能else里面的语句再解释一下?这里是主要难点,确实是想不明白,麻烦你了。我说一下我对这个递归的大概理解:由于是一个排列组合,那么就是首先排第一个数,然后排第二个数,排到第m个,显然这里是个递归,当排到第m个数的时候即输出。但是就是这里的排列到底要怎么实现,确实就是不明白,也可能我的思路错了,希望帮忙纠正下,谢谢

本文链接:http://windsorflowers.net/diguilicheng/101.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部