2013-11-21 3 views
2

Итак, я пишу этот простой код (когда он закончен, он должен считать значения n полиномов, каждый из r степеней, в n точках.Я также не могу использовать циклы, я должен делать вещи в рекурсивных функциях, но это еще не сделано, и тема не имеет ничего общего с моей проблемой).Функция возвращает кажущееся случайное число вместо значения возвращаемой переменной

Таким образом, код до сих пор:

#include <iostream> 
#include <cmath> 
using namespace std; 

void wypisz(int i, int k, int* c) 
{ 
    if (i<k) cout<<*(c+i)<<" "; 
    else return; 
    i++; 
    wypisz(i,k,c); 
} 

void podaj(int i, int k, int* c) 
{ 
    if (i<k) cin>>*(c+i); 
    else return; 
    i++; 
    podaj(i,k,c); 
} 

int wynik (int i, int k, int* c, int su, int mn) 
{ 
    int y; 
    if (i<k) { 
    cin>>y; 
    su+=y*mn; 
    mn*=*c; 
    } 
    else {cout<<su<<endl; return su;} 
    i++; 
    wynik (i, k, c, su, mn); 
} 

int main(){ 

    int m,n,r; 
    cin>>m; 
    int tab[m]; 

    podaj(0,m,tab); 
    wypisz(0,m,tab); 

    cin>>r; 
    cout<<wynik(0,r,tab,0,1); 
    system("PAUSE"); 
    return 0; 
} 

Он считает первый полином в первой точке, но только в функции. При вызове

cout<<su; 

только перед завершением функции wynik(), она дает правильное значение, но при вызове

cout<<wynik(0,r,tab,0,1); 

в основной(), это дает гораздо выше, казалось бы, случайное значение.

Может ли кто-нибудь сказать мне, почему?

Заранее спасибо :)

+4

Я думаю, что ваша функция wynik не имеет «возврата» в своей последней строке. –

+0

Более описательные имена переменных будут иметь большой путь к тому, чтобы сделать это более читаемым. И вы говорите о * рекурсивных * функциях в описании проблемы? – John

+1

По какой-то причине кажется распространенным недоразумением. Возврат по-прежнему необходим даже при выполнении рекурсии. – john

ответ

4

В вашей wynik функции, при выполнении рекурсии, вы не exacly возвращением вычисленного значения ... вы должны изменить последнюю строку:

wynik (i, k, c, su, mn); 

к

return wynik(i, k, c, su, mn); 

Или, еще лучше, изменить всю функцию, так это выглядит разъясняя:

int wynik (int i, int k, int* c, int su, int mn) 
{ 
    int y; 
    if (i<k) { 
    cin>>y; 
    su+=y*mn; 
    mn*=*c; 
    return wynik (++i, k, c, su, mn); 
    } 
    else return su; 
} 
+0

Это полностью помогло, спасибо! Не могли бы вы объяснить мне (только для лучшего понимания того, что я делаю), почему это привело к тому, что правильное значение su было потеряно только при завершении функции, а не раньше? – user3019593

+0

@user Код, следующий за вашим предложением 'else', никогда не возвращал значение с помощью оператора' return'. В скомпилированном коде целочисленное значение обычно возвращается в регистре 'eax' (или' rax' для 64-битного). Недопустимый оператор 'return' никогда не записывает правильное значение в этот регистр. Когда функция возвращается, любое значение в регистре интерпретируется как возвращаемое значение. Таким образом, приводя к кажущимся случайным значениям. – IInspectable

+0

Допустим, вы назвали 'wynik', и он назвал себя внутри. Во втором вызове функция, вычисленная ** X **, отправила ее в 'cout' и закончила. Затем управление вернулось к первой функции 'wynik', и значение потерялось там, потому что вы не вернули его оттуда. –

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