递归寻求较低数字的执行算法非常慢

Kev*_*vin 9 c algorithm recursion

嗨,我有以下代码

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

#define min(x, y)(x < y)?(x):(y)
#define SIZE 1000

int valormenor(int a[], int n)
{
    if(n == 1)
        return a[0];
    else
        return min(a[0], valormenor(a + 1, n - 1));
}

int main(void)
{
    int arr[SIZE] = {0}, i;
    srand (time (NULL));
    for(i = 0; i < SIZE; i++)
        arr[i] = rand() % SIZE;
    arr[5] = -1;
    printf("%d\n", valormenor(arr, SIZE));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

关键是不明白,因为找到最小数字需要太长时间,我的理论是这个递归函数实现得很糟糕,你声称谁?

use*_*ica 15

我们在min这里扩展宏:

return min(a[0], valormenor(a + 1, n - 1));
Run Code Online (Sandbox Code Playgroud)

那变成了

return (a[0] < valormenor(a + 1, n - 1))?(a[0]):(valormenor(a + 1, n - 1));
Run Code Online (Sandbox Code Playgroud)

如你所见,valormenor被叫两次.这两个递归调用会产生四个递归调用,这会产生八个递归调用,依此类推.这是一个经典的双重评估错误.

不要使用这样的宏.他们只是不值得头疼.

  • @Tony:不要那样做.每个问题一个问题. (3认同)