如何在C中编写递归延迟函数

时间:2014-10-10 11:30:44

标签: c recursion

作为一个有趣的编码会话的一部分,我的朋友正在研究用C编写延迟函数,我不是主要用C语言编程,我以前用过。但是,我想用递归编写一个,但是还没有完全能够实现我想要的程序......这就是延迟,比如20ms。我想我在这里缺少一些逻辑......怎么办我使用递归编写延迟函数。目前我的代码看起来像这样,它需要处理毫秒到秒的范围。

    #include <stdio.h>
    #include <stdlib.h>

    void delay(unsigned long* d) {
        while(*d-- > 0){
           delay(d);
        }
    }

    int main()
    {
        unsigned long del = 200;
        delay(&del);
        return 0;
    }

2 个答案:

答案 0 :(得分:3)

这看起来总的来说是一个非常糟糕的主意;在大多数环境中,繁忙的循环延迟是有意义的,你实际上负担不起,这只会延迟消耗。

那就是说,我认为将其指向导向是不合适的,因为它在调用中分享了奇怪的价值。

应该是这样的:

void delay(unsigned long d)
{
  if(d > 0)
    delay(d - 1);
}

当然d产生的实际延迟之间绝对没有没有连接,这取决于OP没有透露的一大堆因素,而且我没有采取这非常重视,试图获取信息。

同样,while会破坏“这是递归的”思维方式。

答案 1 :(得分:1)

坏,坏,坏......

首先,这在实践中不起作用,如果传入大量数据以获得任何有价值的延迟,您将耗尽堆栈空间并且程序将因错误而中断或导致一些随机的未定义行为。

此外,您没有说明您运行的平台,但通常最好调用操作系统等待功能,以便等待的行为不会占用当前核心,当前进程可以屈服于其他系统上的进程/线程,或者如果没有工作可以通过缓慢运行来节省电力,直到需要为止。

延迟循环如何实际与实时相关?它将在不同的硬件上以不同的速度运行,并且每次运行时还会依赖于同时运行的其他硬件。为了确保您的准确性,我们需要将环路连接到时钟或其他硬件信号,以便您像硬件中断或其他类似的那样跟踪时间。