【问题标题】:Why is it bad to call functions recursively?为什么递归调用函数不好?
【发布时间】:2016-02-04 08:39:45
【问题描述】:

在我正在上课的课程中,我的老师不鼓励学生递归调用函数。比如我想在下面的代码中调用main函数:

if (x > 5) {
    printf("Your number's too high. Enter a number below 5.");
    main();
}

我被鼓励使用:

int x;
while (x > 5) {
    printf("\nYour number's too high. Enter a number below 5.");
    scanf("%d", &x);
}

虽然我知道 while 函数是解决这个特定问题的一种更简单的方法,但我们被告知要避免整个递归,尤其是使用 main()。但是,我认为这是在编程中使用的一个相当重要的概念。为什么要避免这种事情,尤其是在调用 main() 时?

【问题讨论】:

  • main() 通常会在其中包含一些设置代码和初始化,因此在这种情况下递归通常是一个坏主意。仅在真正有意义时才使用递归——某种分治算法——而不是作为循环的替代品。
  • 有时堆栈溢出问题...递归调用函数“有时”会给内存增加很多负担。通常不鼓励这样做。
  • “递归调用函数不是坏事”。从函数调用“main()”IS 不好!如果一个简单的循环可以更好地工作,那么使用递归(这涉及一些开销)也是不好的。这是一个有用的线程:cboard.cprogramming.com/c-programming/…
  • lisp 当然喜欢递归
  • 如果您在此部分之前进行任何其他类型的输入或其他任何操作,您的第一个选项将不起作用

标签: c function recursion


【解决方案1】:

好问题。

有些类型的问题用递归更容易解决,但一般来说,只要有可能,迭代通常更有效。

简而言之,这样做的原因是每次我们进入一个新函数时,我们都必须保存我们离开的位置以及那里的所有变量,这样当内部函数终止时,我们可以在父目录中恢复。

最终你必须记住每个父函数的数据,这会很多,所以你会耗尽你的记忆。此外,保存数据和创建新上下文以执行新函数的过程需要花费少量时间,当您进行数十万次调用时,这些时间会加起来。

您可以通过阅读计算机体系结构和汇编语言来了解更多关于编译器所做的很酷的事情,以使我们认为理所当然的所有事情(函数、循环)。

例如,查看加州大学伯克利分校关于该主题的课程资料:http://www-inst.eecs.berkeley.edu/~cs61c/fa15/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多