【发布时间】:2014-06-28 09:05:37
【问题描述】:
...还是只是一种练习?
我之所以问这个问题是因为我和教授的争论:我因为在课堂上没有涉及递归而递归调用函数而失去了信誉,我的论点是我们通过学习 return 隐含地学习了它和方法。
我在这里问是因为我怀疑有人有明确的答案。
比如下面两种方法有什么区别:
public static void a() {
return a();
}
public static void b() {
return a();
}
除了“a永远持续”(在实际程序中,当提供无效输入时正确使用它再次提示用户)之外,a和b之间有什么根本区别吗?对于未优化的编译器,它们的处理方式有何不同?
最终归结为是否通过从b学习return a(),我们是否也从a学习return a()。我们有吗?
【问题讨论】:
-
精彩的辩论。我想知道你是否这样向你的教授解释过。如果你这样做了,我认为他应该给你失去的信用。
-
递归甚至不是计算机科学独有的概念。斐波那契函数、阶乘运算符和许多来自数学(可能还有其他领域)的其他东西都是(或至少可以)递归表达的。教授是否要求你也忘记这些事情?
-
教授应该给他额外的荣誉,因为他想出了一种优雅的方法来解决问题,或者说开箱即用。
-
作业是什么?这是我经常想知道的一个问题,当你提交编程作业时,被标记的是什么,你解决问题的能力或者你使用所学知识的能力。这两个不一定相同。
-
FWIW,提示输入直到正确不是使用递归的好地方,太容易溢出堆栈。对于这种特殊情况,最好使用
a() { do { good = prompt(); } while (!good); }之类的东西。
标签: recursion