C/C++

При совершении арифметических операций с переданными в рекурсивную функцию переменными, переменные меняются(Си)

Передаю в рекурсивную функцию переменную, в этой функции произвожу с этой переменной арифметитескую операцию, например b+1

В результате меняется переменная b
Почему она меняется если я такой функции не закладывал?
Так должна была бы измениться переменная b=b+1; а так не должна b+1

Вот код
int func(int a,int b)
{
if (b<1) return 1;
return a*func(a,b-1);//Здесь b-1
}
int main()
{
printf("%d\n", func(5,4));
}
Это нахождение степени числа. В данном случае 5 в 4 ой степени.
С каждой итерацией переменная b уменьшается.
С каждой итерацией переменная b уменьшается.
А у тебя return a*func(a,b+1); будет вызов
func(5,5) уже в 5 степени и так далее возрастать.
Может b-1 надо, а ?
Вячеслав Демидюк
Вячеслав Демидюк
62 539
Лучший ответ
Сармат Халиев Да, я изменил код
Сармат Халиев Вопрос почему уменьшается. Это ведь не --b
Кстати ничего не изменится если вместо b-1 вставить --b
Сармат Халиев b-1 это арифметическая операция. Переменная меняться не должна.
Переменная меняется только так b=b-1;
Сармат Халиев Этот алгоритм работает только в условии функции наверное
Вне условия это не работает
int func(int a,int b)
{
if (b>0)
{
b-1; //Здесь b-1
printf("%d\n", b);
func(a,b);
}
return 0;
}
int main()
{
func(5,4);
}
Сармат Халиев >>Когда мы делаем вызов функции func(a,b-1)
мы по сути делаем присвоение скрытое,
Неа
void func(int a)
{

}
int main()
{
int a=10;
func(a-1); //Здесь а-1
printf("%d\n", a);
}
Переменная не меняется.
Сармат Халиев А, ок. Эта переменная в функции меняется
void func(int a)
{
printf("%d\n", a);
}
int main()
{
int a=10;
func(a-1);
}
Сармат Халиев хмм, не это немного другое
Сармат Халиев Ок. Понял кажется.
Сармат Халиев Да, понял. Это же разнае переменные.
Сармат Халиев Этот пример очень понятно это объясняет
void func(int a)
{
printf("%d\n", a);
}
int main()
{
int a=10;
func(a-1);
}
Значение a-1 передаётся в функцию.
В случае с рекурсивной функцией это переменная с одним и тем же именем.
> Почему она меняется если я такой функции не закладывал?
Переменная не меняется, но постановка вопроса говорит о том, что вы не понимаете, как работают параметры функций.

int a = 10; // Это одна переменная a
void fun1 (int a) { }; // это - другая переменная a
void fun2 (int a) { }; // это - третья
void main() {
int a = 3; // это - четверая. И все они никак не связаны друг с другом и могут принимать различные значения одновременно(!) во время работы программы.
}

При этом во время работы функция fun1 может быть вызвана произвольное количество раз (в том числе одновременно) и на каждом вызове у неё будет своя собственная переменная a со своим собственным значением и отличающимся адресом в памяти от остальных фреймов выполнения этой же самой функции..

Переходя к рекурсивной функции
int func(int a,int b)
{
if (b<1) return 1;
return a*func(a,b-1); //Здесь создаётся новый фрейм вызова для выполнения func, в котором будут свои собственные переменные a и b, при этом a в момент входа будет тем же, а b - будет на 1 меньше, чем у предыдущего фрейма этой же функции (и физически лежащего ниже в стеке вызовов)
}

Если на втором вызове в отладчике (например, gdb) поставить паузу, то между этими фреймами можно переключаться командами up / down и смотреть значение переменных b - во внешнем (верхнем) фрейме она будет равна 4, во внутреннем - 3 (затем 2, 1 если продолжать рекурсию и создание новых фреймов вызовов).
Ислом Юсупов
Ислом Юсупов
30 155

Похожие вопросы