...还是只是一种练习?
我问这个是因为我的教授的一个论点:我失去了递归调用函数的信誉,因为我们在课堂上没有讨论递归,我的论点是我们通过学习return
和方法隐式地学习了它。
我在这里问是因为我怀疑有人有明确的答案。
例如,以下两种方法有何不同:
public static void a() {
return a();
}
public static void b() {
return a();
}
除了“a
永远继续”(在实际程序中,当提供无效输入时,它被正确地用于再次提示用户)之外,a
和B
之间还有什么根本的区别吗?对于未优化的编译器,它们的处理方式如何不同?
归根结底,这取决于我们是否通过学习从b
返回我们有吗?
回答你的具体问题:不,从学习语言的角度来看,递归不是一个特性。如果你的教授真的因为你使用了一个他还没有教过的“特征”而给你扣分,那就错了。
从字里行间可以看出,一种可能性是,通过使用递归,您避免了使用本应是他的课程学习结果的特性。例如,您可能根本没有使用迭代,或者您只对循环使用,而不是对
和while
同时使用。很常见的情况是,一项作业旨在测试你做某些事情的能力,如果你不做,你的教授就不能给你这个特征的分数。然而,如果这真的是你丢分的原因,教授应该把这当成他或她自己的一次学习经历--如果展示某种学习成果是作业的标准之一,应该向学生清楚地解释。
说到这里,我同意大多数其他评论和答案,迭代是比递归更好的选择。有几个原因,虽然其他人在某种程度上谈到了它们,但我不确定他们是否完全解释了它们背后的思想。
堆栈溢出
更明显的一个是,您有可能得到堆栈溢出错误。实际上,您编写的方法不太可能真正导致堆栈溢出,因为用户必须多次给出错误的输入才能真正触发堆栈溢出。
但是,要记住的一点是,不仅仅是方法本身,调用链中更高或更低的其他方法也将在堆栈上。正因为如此,随意地吞噬可用堆栈空间对于任何方法来说都是非常不礼貌的事情。没有人希望在编写代码时总是担心空闲堆栈空间,因为其他代码可能会不必要地占用大量空闲堆栈空间。
这是软件设计中称为抽象的更一般原则的一部分。实际上,当您调用
dothing()
时,您需要关心的只是事情是否已经完成。您不必担心如何完成的实现细节。但是贪婪地使用堆栈破坏了这一原则,因为每一点代码都必须担心它可以安全地假定调用链中其他地方的代码留给它多少堆栈。
可读性
另一个原因是可读性。代码应该追求的理想是成为一个人类可读的文档,其中每一行都简单地描述了它在做什么。采用以下两种方法:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
范瑟丝
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
本文向大家介绍什么是递归?用Java写一个简单的递归程序,包括了什么是递归?用Java写一个简单的递归程序的使用技巧和注意事项,需要的朋友参考一下 什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决。 递归的要素 自定义递归函数,并确定函数的基本功能 例如Java从键盘输入一个数,求输入这个数的阶乘。
首先,一些定义,以确保我使用的术语是清楚的: > 强实体和弱实体以及强/识别和弱/非识别关系:在ERD中,弱/非识别关系是连接两个强实体的关系,并用虚线表示。强/标识关系是将强实体连接到弱实体(即包含其相关实体的主键[PK]作为其自身组件的实体)的关系 <罢工> 组件 主键),并由实线指示。 例如,考虑一下这张图(从另一篇文章中借来): 课程(强实体)和类(弱实体)之间的关系是强关系(实线),因为
问题内容: 我需要从目录及其所有子目录复制所有文件。我如何在UNIX / Linux终端中做到这一点?命令不起作用。 问题答案: 对于本地文件复制以及计算机之间的复制很有用。这将做您想要的: 的完整目录结构。被复制到/ destination_dir,但是仅复制.jar文件。-a确保文件的所有权限和时间均不变。-m将省略空目录。-v用于详细输出。 对于空运行,请添加-n,它将告诉您它将执行的操作,
我想我理解了教科书中对尾部递归函数的定义:在函数调用后不执行任何计算的函数。我还发现,作为一个结果,尾部递归函数的内存效率会更高,因为它每次调用只需要一条记录,而不是每次都需要保留一条记录(就像在普通递归中那样)。 我不太清楚的是,这个定义如何应用于嵌套调用。我将提供一个例子: 我最初给出的答案是,根据定义,它不是尾部递归的(因为外部调用是在计算内部调用之后执行的,所以其他计算是在第一次调用之后完
我在做一些类似递归获取属性的事情 代码的问题是:它只下降了一级,我想知道如何使用反射自动获取所有属性?我刚刚编写了以下示例容器代码: 在主要方法中: 我希望得到: 我现在得到的结果是: 有人能帮我使用PrintProperties方法吗?非常感谢你。