问题解决/算法技能是诀窍还是可以通过实践发展?[关闭]


70

每当我遇到一个棘手的问题,并且如果无法找出确切的解决方案或无法开始时,我都会与自己进行这种永无休止的讨论,如下所示:

  • 解决问题/数学/算法技巧是有天赋的(不是您可以通过实践来学习,通过实践,您只能掌握以前已经解决的问题的类型)

  • 只有上过好学校的人才能做到,因为他们早就学会了。

您有什么想法,一个人可以通过艰苦的工作来解决问题/算法,而又需要一个额外的基因吗?


SO不适用于民意测验问题。请参阅stackoverflow.com/faq上
解答

即使您没有天赋,实践也会有所帮助;)尝试向他人学习。
Hamish Grubijan

12
这是一个真正的混乱,而不是民意测验。如果您要问,我可以删除问题,但并不能在这里结束。我相信很多像我一样的学生也会有同样的困惑。
Ramadheer Singh 2010年

2
神!我要发布相同的问题@Nasgul fav和+1
Sobiaholic 2012年

2
这也是我经常想到的事情。作为上大学之前先去上班的人。总是让我感到惊讶的是,那些没有编程经验的同学如何学习的步伐比我快得多,并且不需要太多练习就能解决困难的编程问题(尽管存在差距)。同时,我一直在尝试不断尝试解决更难的问题,但是尽管尝试了很长时间,但解决问题的技巧似乎并没有完全改善。这确实让我不知道我已经达到了我的智力与工作记忆:(极限。
snowpolar

Answers:


73

我一生中的大部分时间都在想,才干是您开发的东西还是天生的东西。然后我想到答案是无关紧要的,至少如果您想自己实现目标。即使您有才华,也只有在您认为才华来自实践的情况下才会对您有所帮助,因为您会更加努力。

关于算法以及任何其他真正困难的技能,需要实践才能变得良好。我不知道你是否也必须有一些才能。我确实知道,但是,人们通过练习在诸如TopCoder之类的比赛中取得了巨大的进步。我自己从中学到了很多。

如果您建立了系统的培训计划,即使它并不完美,您也将处于领先地位。到目前为止,我已经在TopCoder上编写了数百个程序,它深刻地影响了我的思维。我学到了很多事情,只有做错了事然后纠正我的错误才可以学到。我的一个朋友写了几千本在TopCoder上程序,尽管他刚起步时的表现比我的差,但他的表现比我好。那不是巧合。

编辑:

我刚刚在math.stackexchange上遇到了这个答案。我认为,即使他撰写有关国际象棋和数学的文章,这也是关于如何学习已阅读算法的最好解释之一。


30

1)不要尝试以最一般的抽象来解决问题。
2)当您的大脑处于最大工作状态时,选择正确的时间。

我从数学老师的建议中得到了第一点。有用!尝试做不同的例子和问题的方案。这极大地有助于确定在大多数问题中最难理解的边缘情况。

解决此类问题的最佳时间是黎明(凌晨4点至6点)。前一天晚上睡个好觉,并准备好解决此问题。沉默是你的朋友。

我确实相信有些人比其他人有更多的智慧,但这不是最重要的因素。这就是您如何利用这种智能来解决问题的方法。


我绝对相信您所说的每个字符,而这两个建议是我收到的最好的建议。我将@JørgenFogh的答案标记为最终答案,因为这消除了我的困惑。完美的答案将是他的结合。我认为您在最后一句话中说了同样的话,但冗长的版本使我更加信服。非常感谢您的时间和帮助:)。
Ramadheer Singh'7

1
只是想再次告诉您,您的提示仍然对我有帮助(每次我都做得太深时,我都会尝试回顾您的两个提示)@AraK,非常感谢!
Ramadheer Singh 2011年

18

我十二岁的时候在小组课上上了魔术课。魔术师的名字叫乔·卡罗塔。他有一次魔术,我脱口而出:“你是怎么做到的?” 从那以后,他说了那句话,一直困扰着我。

乔的回答是:“迈克尔,如果您真的想知道该技巧是如何完成的,则必须弄清楚自己将如何做。”

好吧,这当然不是我想听的,但确实让我专注于解决问题。从我的角度来看,这是解决问题的方法。如果我第一次尝试解决问题时采取了17个步骤,而且真的很笨拙,那么好消息是我解决了问题。

然后,通过查看我开发的解决方案,并进一步寻找改进该解决方案的方法,我将学习如何简化最终结果。后来,在我的计算机编程生涯中,我发现此过程称为“逐步优化”。

它早在1971年就开始运作,直到今天仍在运作。


9

对我来说,我认为这有点天赋,但更重要的是经验和实践。如果您知道许多问题并找到了最佳解决方案,则可以更轻松地提出新问题的解决方案。

我过去的例子:有一次编程竞赛(很好的训练,顺便说一句),我没有找到一个好的解决方案。获胜者主要通过使用KD-Tree解决了该问题。为此,您首先需要知道什么在这种情况下是KD-Tree,以及它的用处。今天,这对我来说很清楚,如果我再次遇到类似的问题,我将能够很快解决它。


1
你说的100%是有道理的。一个人将解决的许多问题。他/她将获得许多信心。
Arup Rakshit 2015年

3

如果人才不努力,努力就会胜过人才。上面的陈述定义了持久性的真正潜力是什么,这个世界上的任何技能都可以通过实践来发展,这个过程类似于将钉子钉在墙上,不仅需要正确的幅度,而且需要正确的方向。


1

要回答这个问题,首先我们需要找到解决问题的能力的要素。

  1. 有所谓的天赋。这是您天生的才能。这决定了您的潜力。天生具有更多灰质的人往往会比自然不那么慷慨的人表现更好。这意味着,如果具有相同的参数(教育,个性,耐压力,意志力),那么拥有更好才能的人比没有同样才能的人更有可能表现更好。如果人们发现他或她倾向于花费大量时间来吸收新信息,直到他或她能够应用它,那么对这个人来说,最明智的决定就是离开程序设计,并避免充满挫败感的生活。自然地,我们不能指望初学者能够立即理解最复杂的现象,但是如果初学者太慢而无法理解初学者的概念,

  2. 人才发达。一个人天生就有天赋,但这本身不足以解决问题。我从未见过新生儿写代码。一个人必须接受一些教育。越早越好。另外,学校的质量也很重要。我们永远不应否认这样一个事实,即一个人没有机会在一所好学校里提早学习编程,那么他或她在争取成功的过程中就会遇到障碍。但是,如果某人早早念完好学校,那么就可以通过艰苦的工作来弥补这一障碍。例如,我的妻子在另一个领域接受过教育,但是大学毕业后,她找不到合适的工作。所以我开始教育她。一个月后,她学会了学习方法,并能够解决几乎所有出现在她身上的问题,但她仍然没有效果。她逐渐开始以自动协商的方式学习。一年后,她已经是一名专业编码员。她没有来自学校的可编写代码的论文,但是她做得很棒。因此,她错过了早期教育,但后来能够消除这种障碍。发达的人才可以描述为学习和掌握的信息集,以及正确的态度,应对新型挑战的科学方法。

  3. 实践:实践是提高发达人才水平的好方法,但是,它不应该成为发展人才的唯一来源。随着实践的发展,理论视野必须定期扩大。

  4. 工作策略:一个人可以很有才华,可以有很多知识。如果他或她没有正确的工作策略,那么他或她就会遇到障碍。每当给出新任务时,都应提出正确的问题:

    • 与此任务最接近的任务是什么?我可以在一定程度上重用我的解决方案吗?
    • 我应该学会什么才能解决这个问题?
    • 如何编写清晰高效的代码来解决问题?

因此,答案是:尽早接受良好的教育固然很好,但这不是必须的。不要忘记,生活是最好的学校,如果您有才华,意志力和信息资源,您可以在以后弥补失去的机会。实践不仅向您展示解决问题的正确步骤,而且还拓宽了您的视野。例如,如果一个人理解数字系统,那么他或她将能够在以后理解各种事物,例如CSS,PSD中的颜色或数字溢出。如果学习如何用Java编写代码,那么他或她将很快理解C#。因此,实践不仅为您提供了针对给定问题类型的解决方案的知识,而且还为您提供了新的理论知识,这些知识将在各个领域中发挥作用。一个人必须发展的核心技能是快速学习的能力。


0

有许多例子说明人们拥有非凡的才能而成功却很少。您会在体育,政治,商业以及周围的环境中看到此类示例。所以,我觉得经过一定的限制,才华是毫无意义的美德。它最难的词是奖励您更大的成功。如果你跟随板球运动这里是一个很好的例子的链接。我觉得同样的原理适用于算法和问题解决。一年前,我习惯于解决算法问题,并发现自己完全迷路了。一年的时间用于阅读算法书籍,解决算法问题以及解决更多编程问题,我有信心现在可以解决大多数问题(要提高自己的效率还有很长的路要走)。但是关键是,聪明的工作足以发展解决问题的诀窍。


0

人才便宜而没有努力就没有用。

才智只能在某种程度上将您带入,但是通过努力和实践,任何人都可以达到很高的境界-乔什·怀茨金(Josh Waitzkin),曾八次获得国际象棋冠军,获得过十三次全国冠军和两次世界冠军

国际象棋大师

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.