1
kmvan 2014-11-01 16:51:41 +08:00
lz用的是啥手机拍的?重心偏绿四周姨妈红了!是华为中兴之类的国产手机吗?
|
3
kmvan 2014-11-01 17:07:57 +08:00
原来是 apple 的ipad min,我错了,实际上这色彩还原度很不错,肯定是lz书本本来的颜色就是这样的。虽然有点模糊,应该是lz拍的时候手抖了吧。
|
6
aheadlead 2014-11-01 17:28:53 +08:00
这是个深搜啊...
|
7
llbbzh 2014-11-01 17:31:58 +08:00
OI的程序建议上机用fprintf一步一步看它的执行过程
|
8
mcwanderer 2014-11-01 17:34:49 +08:00
@kmvan 。。。。此贴变成了,讨论LZ拍摄技巧和拍摄设备的帖子了。。。
|
9
gyorou 2014-11-01 17:52:30 +08:00 1
趁lz年轻,我来教一下lz提问的学问。
一般有问题,第一个想到的应该是去搜索。是在特么的搜索不到,那么再向可能知道的人询问。 但是,提问之前,要自我反省一下,自己有没有把问题的具体内容描述清楚? 比如这个问题,lz不提供明确的上下文,就说一个全排序,然后截图一段代码,很多人都不会有时间来特意先揣摩一下这个问题到底是什么,然后再做解答的。 然后实在是有无聊蛋疼的人。于是我来解释一下。 首先这个问题的具体要求是:给出一个正整数n,然后输出从1到n的所有可能的排列。(问问题之前,先把问题描述清楚) 那么利用穷举的方法是ok的。 首先这个方法用到了递归。不懂递归的自行补习。 然后看一下这个函数的三个参数,n就是给出的正整数,A指向整数数用来保存中间结果,最后的cur是当前需要决定的数组中的第cur+1( 0<=cur<n)个元素。 那么问题就很简单了首先进入函数之后,先检查一下,如果当前数组A已经有n个元素,那么就已经形成了一个序列,那么输出结果。 如果cur还没到达n,那么我们就开始决定地cur+1个元素到底该放入什么数字。因为现在已经安置好了编号0到cur-1的cur的元素,于是第cur的元素不能和前面的这些元素重复,于是我们设置一个ok的flag,然后从1到n中找到一个还没有在A的0到cur-1中出现的数字。找到了这个数字就将其放入数组A中,然后我们完成了从0到cur个元素,将cur+1,然后开始寻找cur+1可以放入的元素。 |
10
randomize OP @gyorou
感谢抽出宝贵时间回答问题。 问题问的不完全,承认,日后注意。但是总觉得有高中数学基础的人还是能够理解全排列的含义的? 当然,我至少应该多说一句输入指定 n 😂 另外,大大回答的是我已经看懂的,即「这个函数的 else 下面的循环是在每个数字填进去的时候检查此数组前面与其重合的数。」😂,能不能再看一看下面提出的问题? |
11
Sharuru 2014-11-01 18:09:16 +08:00
|
12
iptux 2014-11-01 18:12:50 +08:00
|
14
gyorou 2014-11-01 18:16:25 +08:00
@randomize 这个要弄清递归的机制。递归会把中间结果保存下来,比如这次,想象一下一棵树,root是起点。 root有三个节点,1,2,3,1下面有2,3两个节点,1下面的2节点下面有节点3,1下面的3节点下面有节点2 这种。因为是递归,所以每次程序的起点不会是root,而是上一次的分歧点。
|
15
lizheming 2014-11-01 18:50:15 +08:00
|
16
hx1997 2014-11-01 19:07:56 +08:00 1
竟然看懂了hhh
我们把这个函数简称为 P(n, A, cur),以全排列 1 2 3 为例。递归过程是这样的: P(3, A, 0) → P(3, A, 1) → → P(3, A, 2) → → → P(3, A, 3) 对吧。那么呢,在执行到 P(3, A, 3) 的时候自然就会打印出第一个排列 1 2 3,打印完成后就回到了 P(3, A, 2) 的 else for 这里,这时会 i++ 变成 4 > n(注意是 P(3, A, 2) 中的 i),于是退出循环,再回到 P(3, A, 1) 的 else for 这里,这时会 i++ 变成 3(注意是 P(3, A, 1) 中的 i),于是 A[1] == 3,接着 P(3, A, 2) 再决定 A[2] == 2,再接着 P(3, A, 3) 打印 1 3 2。 回到问题上 1.在枚举完成、输出第一个排列之后,程序如何工作呢?没有 else 条件可以递归到下一次什么的。 → 见上,利用递归性质以及循环。 2.其实我偷偷的把代码打了一遍……可是 a 是个全局数组,输出一次之后就没有什么再次重置的操作么…… → 因为决定完 1 2 3 后会退回到第二个的位置(递归),这时循环将 i++ 变成 3,于是就把第二位的 2 覆盖掉了,不需要重置。 3.检查此次输入与此次前面已经确认的数字里面无重复这个操作我看出来了,可是是如何实现,比如上次输出的排列是 1 2 3 ,这次就应该是 1 3 2 这次如何判断第二位要用 2 而非 3 的? → 见上,利用递归性质以及循环。 感觉还是没讲明白== |
17
klion26 2014-11-01 21:28:30 +08:00
照着程序,手动执行一次,这样印象深刻。
|
18
randomize OP |
20
mikemikemike 2014-11-02 12:02:45 +08:00
@kmvan 你这风向变得好快。。。我去。。。
|
21
kmvan 2014-11-02 12:44:16 +08:00
|