C语言递归中数据消失了?应该怎么改写

在FFT递归中,希望有一个可以累加的变量,代码中是结构体s,这个变量需要传递到下一个递归中,但是调试发现每次进入一个FFT递归,s都被重新置零了,不知道为什么,希望也没有办法可以解决,谢谢

mult和add是复数的乘法和加法,代码中没有给出了

 void FFT(struct Compx *t , int n , struct Compx root , struct Compx result) 
{
    int i,j;
    struct Compx s = {0 , 0};
    struct  Compx * even = (struct Compx *)malloc((n / 2) * LEN);   
    struct  Compx * odd = (struct Compx *)malloc((n / 2) * LEN);

    //划分奇偶项 
    for (i = 0 , j = 0 ; i < n; i += 2 , j++ )
    {
        even[j].real = t[i].real;
        even[j].imag = t[i].imag;
    }
    for (i = 1 , j = 0 ; i < n; i += 2 , j++)
    {
        odd[j].real = t[i].real;
        odd[j].imag = t[i].imag;
    }

    if(n == 2)
    {
        s = add(result, add( even[0] , mult( root , odd[0]) ));
    }
    else
    {
        FFT(even , n / 2 , mult(root , root) , s);

        FFT(odd , n / 2 , mult(root , root) , s);

    }

}

3个回答

s是一个函数内临时变量,每次进入FFT后你都会重新创建s并初始化为0。
你要想实现累加,两种方法,函数体外定义一个变量,或者用FFT的一个参数作累加,每次调FFT都要把这个累加的值赋给这个参数。
还有个重要问题,你malloc什么时候释放?可能会有严重内存泄露。

great978
great978 在n==2的时候返回结果,递归里面也返回,最后才得出结果,谢谢~
一年多之前 回复
great978
great978 我是把void类型的FFT函数换成了struct Compx类型的,在n
一年多之前 回复

调用函数申明:

struct Compx s = {0 , 0};

void FFT(struct Compx *t , int n , struct Compx root , struct Compx s)
{
int i,j;

struct  Compx * even = (struct Compx *)malloc((n / 2) * LEN);   
struct  Compx * odd = (struct Compx *)malloc((n / 2) * LEN);

//划分奇偶项 
for (i = 0 , j = 0 ; i < n; i += 2 , j++ )
{
    even[j].real = t[i].real;
    even[j].imag = t[i].imag;
}
for (i = 1 , j = 0 ; i < n; i += 2 , j++)
{
    odd[j].real = t[i].real;
    odd[j].imag = t[i].imag;
}

if(n == 2)
{
    s = add(result, add( even[0] , mult( root , odd[0]) ));
}
else
{
    FFT(even , n / 2 , mult(root , root) , s);

    FFT(odd , n / 2 , mult(root , root) , s);

}

}

great978
great978 谢谢你啦
一年多之前 回复
great978
great978 (s = add(result, add( even[0] , mult( root , odd[0]) ));)这一行的result因为没有定义,我换成s试试没有结果,这道题我把FFT换成结构体函数,返回结构体后出来结果了
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问