Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么递归调用函数不好?_C_Function_Recursion - Fatal编程技术网

C 为什么递归调用函数不好?

C 为什么递归调用函数不好?,c,function,recursion,C,Function,Recursion,在我上的课上,我的老师不鼓励学生递归调用函数。例如,如果我想在以下代码中调用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."); scan

在我上的课上,我的老师不鼓励学生递归调用函数。例如,如果我想在以下代码中调用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()”是不好的!如果一个简单的循环工作得更好,那么使用递归(涉及一些开销)也是不好的。这里有一个有用的线索:lisp,当然,喜欢递归。如果您在本部分之前进行任何其他类型的输入或其他操作,那么您的第一个选项将不起作用