有没有办法在C中引用你所在的函数?

时间:2011-08-17 23:14:21

标签: c function this arduino

我正在编写一个只查找表内值的函数。是否有可能在其内部调用该函数?我见过关于thisself的内容,并不太了解它。

4 个答案:

答案 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);
    }
}
  • 您可以多次递归,但必须找到一种方法让递归停止或...
  • 如果你的递归下降太多(认为“初始”时间超过一百万......),你只会在百万分之一时间输入相同的函数,从而冒着溢出可用堆栈内存的风险。