我想为数组中元素的乘法做一个递归函数
如果我的数组有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;
}
答案 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];
具有未指定的运算符操作数的评估顺序。