Передаю в рекурсивную функцию переменную, в этой функции произвожу с этой переменной арифметитескую операцию, например 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 уменьшается.
C/C++
При совершении арифметических операций с переданными в рекурсивную функцию переменными, переменные меняются(Си)
С каждой итерацией переменная b уменьшается.
А у тебя return a*func(a,b+1); будет вызов
func(5,5) уже в 5 степени и так далее возрастать.
Может b-1 надо, а ?
А у тебя return a*func(a,b+1); будет вызов
func(5,5) уже в 5 степени и так далее возрастать.
Может b-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 если продолжать рекурсию и создание новых фреймов вызовов).
Переменная не меняется, но постановка вопроса говорит о том, что вы не понимаете, как работают параметры функций.
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 если продолжать рекурсию и создание новых фреймов вызовов).
Похожие вопросы
- Измерить размер массива в функции Arduino. sizeof работает некорректно с переданной в функцию переменной.
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
- Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.
- Напишите реализацию функции lower_bound на СИ в обобщенном виде
- Глобальная переменная. (Си)
- Лютый препод не унимается. Просит без ООП написать функцию обмена значениями переменных любого типа!
- Если в редакторе имя переменной это строковое значение то после компиляции при поиске переменная есть как адресс?
- Записать значения чисел фиббоначи в переменные и вернутт одновременно три значения переменных.
- Как создать под-переменную в python?
- Где располагается нессылочная переменная в ссылочном объекте с++?
Кстати ничего не изменится если вместо b-1 вставить --b
Переменная меняется только так 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);
}
мы по сути делаем присвоение скрытое,
Неа
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 передаётся в функцию.
В случае с рекурсивной функцией это переменная с одним и тем же именем.