我正在编写一个只查找表内值的函数。是否有可能在其内部调用该函数?我见过关于this
和self
的内容,并不太了解它。
答案 0 :(得分:12)
是的,你可以。它被称为递归。
void foo(){
foo(); //This is legal.
}
当然,您需要从中返回以避免无限递归调用。无法返回将导致堆栈溢出。这是一个更好的例子:
void foo(int n){
if (n == 0)
return;
foo(--n);
}
答案 1 :(得分:5)
请参阅 Recursion (computer science) (维基百科)。
在函数内调用函数的示例:
# include<stdio.h>
int factorial(unsigned int number)
{
if (number <= 1)
return 1;
return number * factorial(number - 1);
}
void main()
{
int x = 5;
printf("factorial of %d is %d",x,factorial(x));
}
答案 2 :(得分:2)
其他人已经回答了你的问题,但由于它对你来说很陌生,你可能想要阅读递归和递归函数。如果你不知道,有一些问题可能会引起你的注意。
最糟糕的是,如果你太深,你可以迅速溢出你的堆栈,或者你的函数堆栈分配了很多东西。如果您计划使用递归实现,请确保您的递归是有界的,并且您在堆栈上分配最小值。
您可能想要考虑一种迭代方法 - 每个递归问题都可以通过一些思考迭代地解决。这通常也是一项有趣的练习。
JoshLeaves表示递归更快,但通常不是因为需要分配增长堆栈和设置寄存器。如果你的函数对自己进行两次或多次调用来计算结果,那么迭代解决方案总是更快。
答案 3 :(得分:1)
<强>更新强>
好吧,我认为这是关于“获取每个功能价值”。正如其他海报所说,这称为递归。但是有一些注意事项:
递归比迭代更快(我手边没有基准测试结果,但我在一年前用Intel Core i5运行它们。)
//Iteration
function do_stuff(i)
{
//BLABLAH
}
for (i = 0; i <5; i++) {
do_stuff();
}
//Recursion
function do_stuff(int i)
{
//BLABLAH
if (i < 5) {
do_stuff(i + 1);
}
}