我用c ++编写的递归函数不起作用

时间:2015-03-25 19:03:32

标签: c++ arrays recursion

我想为数组中元素的乘法做一个递归函数

如果我的数组有1个元素且v [1]为1,程序将显示给我4703488

我的问题是为什么?

#include<iostream>

using namespace std;

int prod(int n,int v[100])
{
    if(n)
    {
        return prod(--n,v)*v[n];
    }

    return 1;
}

int main()
{
    int v[100],n,i=1;
    cout<<"n=";
    cin>>n;

    for(i=1;i<=n;i++)
        cin>>v[i];

    cout<<prod(n,v);

    return 0;
}

4 个答案:

答案 0 :(得分:4)

罪魁祸首是return prod(--n,v)*v[n];行。当您将--n作为函数参数调用时,您不知道n部分中将使用v[n]的哪个值。这会导致未定义的行为。由于数组中0的值是垃圾值,因此可能正在使用该值而不是按计划使用v[1]

编写它的正确方法是return prod(n-1, v)*v[n]。为解决OP的查询,详细说明如下:

int prod(int n,int v[100]) // n has value 1 right now, when called
{
    if(n) // since n has value 1, boolean condition is satisfied and control //flow goes inside the loop
    { // inside the loop part is being executed now
        return prod(--n,v)*v[n];  // the value of n is decremented with --n.   So n is now 0 (or could be 1). The value in v[n] is undefined, and it may be  or 1. Garbage value at 0. Hence, output has garbage value 
    }
    return 1;
}

答案 1 :(得分:2)

因为

而无法正常工作
return prod(--n,v)*v[n];

是未定义的行为。 n使用v[n]的值是多少?函数调用收到的函数或--n的值

在您的情况下,似乎v[n]在递减后使用n的值(并且它使用未初始化的v[0])。但它可能是另一种方式(v[n]之前得到--n

您可以这样修复:

return prod(n-1,v)*v[n];

答案 2 :(得分:2)

这个定义不明确:

return prod(--n,v)*v[n];

原因是--n中的副作用与n中的v[n]的阅读无关。

答案 3 :(得分:0)

我会按照以下方式编写函数

long long int prod( const int a[], size_t n )
{
    if ( n == 0 ) return 0; 
    else return a[n-1] * ( n > 1 ? prod( a, n - 1 ) : 1 );
}

至于你的代码那么这句话

return prod(--n,v)*v[n];

具有未指定的运算符操作数的评估顺序。