2015-03-25 2 views
-4

Я хотел сделать рекурсивную функцию для умножения элементов из массиваМоя рекурсивная функция, написанная на C++ не работает

Если мой массив имеет 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

Если массив имеет один элемент, насколько v [ 1] станет «1»? v [0] должно быть «1». – kadina

+5

Для массива с 1 элементом 'v [1]' is * за пределами границ *, так как индексы массива начинаются с 0. – crashmstr

+2

скомпилируются со всеми предупреждениями и информацией об отладке ('g ++ -Wall -Wextra -g'). Затем ** используйте отладчик ** 'gdb' –

ответ

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; 
} 
+0

Это неправильно. Значения хранятся в массиве, начиная с индекса '1'. 'v [0]' не используется. – axiac

+0

@axiac: Спасибо за это. Фиксация ответа. – therainmaker

+0

@axiac Может быть, он просто этого не осознает. Когда он делает 'prod (-n, v) * v [n]' с 'n = 1', он может вычислять как' prod (0, v) * v [0] '. – Havenard

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]; 
+0

И даже изменив return prod (n-1, v) * v [n], он не будет работать. каково будет значение v [1]? – kadina

+0

это работает, но я не знаю, почему – kaptain5088

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]; 

имеет неопределенный порядок оценки операндов оператора *.

2

это не определен:

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

причина, побочный эффект в --n является unsequenced относительно считывания n в v[n]

Смежные вопросы