新年伊始,首先祝各位新年快乐。
元旦在家没事做,随便找了一道给出一组数字的全排列的编程题,题目要求不要用递归做。
这种题一看“不要用递归做”,那肯定既能用递归,也能用迭代了。想出其中一种,另外一种也就迎刃而解了。
但是周末的时候我一看这道题就头大,光知道一组个数为N数字的排列的个数是N!
。但是怎么用代码实现,一时半会儿没个头绪。在家想了一个多小时,随手写了几行代码,发现漏掉了很多排列。然后就趁着元旦佳节,到处嗨去了。哈哈。
2号上班第一天,另外找了一道题。之前那道排列题并不是放弃了,从小到大所有老师都会教我们“先易后难”,我想既然这道题已经让我产生了挫败感,那就先试着做别的。另外还有一个原因就是,放假在家写的代码没有提交到git,不能沿着之前的思路继续。(事实证明换一道题是对的,说不定做完这道题你会发现自己之前的思路是错的)。这道新题是找出一个集合的子集。思考一番之后,写出代码调试通过,也通过了网站上的测试。解出的速度有点太快,以至于我又想继续看看那道排列题了。
于是,我照着解这道子集题的思路,从小问题到大问题,一下子就发现了排列问题的解法。
对于程序员来说,一旦有这种发现,转化为代码那不过是举手之劳。同时做这道题也让我再一次明白了为何全排列的个数是N!
。
看来,有时候一味的持之以恒,一味地死磕也并不是好办法。学会放弃,但是不要永远放弃。学着用所学所感,联系自己之前放弃过的问题,你会发现,so easy!
同时,任何复杂问题都可以从小处着手。一旦你对小的问题了如指掌,那么大问题不过是递归或者迭代而已!由小及大也是很多算法的根本思想,也是一个人面对挑战时应该采取的理性做法。