最近我正在阅读Joel关于采访软件工程职位的文章,他提到了在一些简单的谜题之后向候选人询问Recursion和Pointer的问题。
我想知道为什么Pointers和Recursion被认为是复杂的问题?
更新:如果可以这样说,可以采取哪些措施来改进指针和递归技巧?
感谢。
答案 0 :(得分:22)
有人曾对我说过,我同意 - 指针是一个简单的概念,但很难编码,递归是一个困难的概念,但很容易编码。
指针编码可能很棘手,因为问题所在的位置可能并不明显,或者甚至存在问题 - 指针引起的问题可能不会出现在第一次或第二次甚至第一百次运行中,但随后突然间,你有一个问题。调试它们也很困难。
递归很容易编码 - 只需要调用函数本身,并做一些事情来跟踪你的位置。困难在于确保您对函数可能采用的所有可能路径有足够的理解,并确保它始终能够自行退出循环。
答案 1 :(得分:4)
他们需要保留有关多层数据的详细信息。有几层比一层更复杂。
指针比值变量更复杂。它本身是一个变量,但它用于保存另一个变量的地址。您需要掌握指针值与其他变量值之间的差异。
递归比带有循环的普通代码更复杂,因为您需要掌握当前调用的原因和方式,将进行的其他调用,当前调用返回时的效果以及所有调用的方式这解决了手头的问题。那是复杂的。向此添加间接重复(当A()
调用B()
,B()
调用C()
和C()
再次调用A()
时,会非常有趣。< / p>
答案 2 :(得分:2)
递归非常简单,可以在LOGO中使用 - 一种类似于LISP的编程语言,旨在方便幼儿使用。对于许多基本用途来说,这是一个相当直观的概念。
另一方面,指针对于许多程序员来说似乎很复杂 - 特别是那些从未接触过汇编程序的程序员。特别令人困惑的是,C(和C ++)基本上可以互换地处理数组和指针,即使它们通常由不同的数据类型表示。例如,指向1D阵列的指针数组在源代码中的解引用与二维数组完全相同,即使它们具有完全不同的内存布局,并在发生解引用时生成相当不同的机器代码。
答案 3 :(得分:2)
为什么指针......被认为是复杂的问题?
实际上有一篇Joel文章略微回答了你的问题:在The Guerrilla Guide to Interviewing (version 3.0),他说(原始重点):
我已经意识到这一点 理解C中的指针不是一个 技巧,这是一种能力。在第一年 计算机科学课,有 一开始总是约200个孩子 这个学期的所有人写的 BASIC中的复杂冒险游戏 他们4岁时的电脑。 他们有很好的时间 在大学学习C或Pascal,直到 有一天他们教授介绍 指针,突然间,他们没有得到 它。他们只是不明白 什么都没有。 90%的班级 走了,成为政治科学 专业,然后他们告诉他们的朋友 没有足够的好看 适当性别的成员 他们的CompSci课程,这就是他们的原因 切换。 出于某种原因大多数人 似乎是在没有参与的情况下出生的 了解指针的大脑。 指针需要复杂的形式 一些双重间接思考 人们根本做不到,而且很漂亮 良好的编程至关重要。许多 开始的“剧本运动员” 通过复制JavaScript进行编程 片段进入他们的网页然后去了 学习Perl从未学过 指针,他们永远不会 生成您需要的质量代码。
这是所有这些着名的来源 你听到的面试问题, 比如“翻转链表”或 “检测树形结构中的循环。”
为大报价道歉,但它就在那里。
答案 4 :(得分:2)
理解指针需要概念性地理解计算机系统的内存架构:编号内存中的每个地址都是一个可以放置数据的插槽,而某些插槽包含其他插槽的数量。那是不平凡的。更重要的是,它不是简单程序所必需的。拥有这种概念性的理解并能够用它来解决问题在我看来显示出想要弄清楚计算机中究竟发生了什么的愿望。
此外,要精通指针,你需要练习。想想C的益智游戏,比如:'从下面的声明中,用词语'
描述 a 的类型int* (*)(int*[]) (a*[])(int *[]*, float[][]**);
快速轻松地回答这个问题需要什么,或者处理多个间接层面的任何其他问题?您需要花时间深入思考编程语言级别的指针。
这与递归类似。要简单地遍历递归函数,您必须了解调用堆栈以及如何传递和返回参数。要掌握递归函数,您必须能够将问题分解为更小的部分并逐个解决。
使用递归和指针的流畅性需要作为编写硬代码的基础的概念。我相信掌握这些概念所需的奉献精神是优秀程序员的关键因素。更重要的是,通过对需要它们的主题进行10分钟编程测试来显示某人对概念知识的漏洞并不难。听起来像是很棒的面试问题。
答案 5 :(得分:1)
我想说因为很多学生在尝试指针和递归之前没有足够强烈地掌握编程基础知识,所以他们太早搞砸了。
此外,学生喜欢影响其他学生认为概念比实际更难。
我很幸运能够学习pascal和C作为我的第一门编程语言,因此指针和递归很自然,并且感觉并不复杂。
答案 6 :(得分:1)
它们是简单的概念,但它们很容易搞砸。
这使得指针和递归成为编程谜题和面试问题的非常合适的主题。
答案 7 :(得分:0)
他们真的不那么复杂。他们在面试测试中使用的原因是因为优秀的程序员可以快速地对他们进行探索,而糟糕的程序员可以快速浏览他们。因此,他们可以预测候选程序员是否在编程方面遇到麻烦。