在我要上的课上,我的老师正在劝阻学生们不要递归地调用函数。例如,如果要在以下代码中调用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()时?
最佳答案
好问题。
有很多类型的问题更容易用递归来解决,但一般来说,只要可能,迭代通常更有效。
简而言之,原因是每次我们进入一个新的函数时,我们必须保存我们离开的位置以及所有的变量,这样当内部函数终止时,我们可以在父函数中继续。
最终,您将不得不记住每个父函数的数据,这将是很多的,所以您将耗尽您的内存。另外,保存数据和创建新上下文以在中执行新函数的过程需要花费少量的时间,这些时间在执行数十万个调用时累积起来。
通过阅读有关计算机体系结构和汇编语言的知识,您可以进一步了解编译器为使所有我们认为理所当然的事情(函数、循环)变得更酷的事情。
例如,查阅加州大学伯克利分校的课程材料:http://www-inst.eecs.berkeley.edu/~cs61c/fa15/
关于c - 为什么以递归方式调用函数很糟糕?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33511917/