Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 23

Передача аргументов в функцию. Почему так?

19.01.2023, 18:33. Показов 925. Ответов 14

Студворк — интернет-сервис помощи студентам
Привет, изучал рекурсию и обнаружил непонятый для меня момент.

Есть функция test_recursion, которая должна искать кол-во комбинаций путей по сетке (x, y) от одного угла к противоположному.
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
int test_recursion(int x, int y){
    if ((x == 0)||(y == 0)){
        return 1;
    } else {
        return test_recursion(--x, y) + test_recursion(x, --y);
    }
}

Но почему префиксный декремент неправильно передаёт значения?
Попробовал префиксный, постфиксный декременты и просто через "x-1". Вот таблица результатов:
Кликните здесь для просмотра всего текста
xy--xx--x - 1
224N/A6
334N/A20
444N/A70
554N/A252
664N/A924
774N/A3432
884N/A12870

Почему так?
Префиксный сначала декрементирует, потом отдаёт значение. Постфиксный отдаёт копию, а оригинал декрементирует.

Как я понимаю этот момент:
Кликните здесь для просмотра всего текста
C++
1
2
test_recursion(--x, y)
test_recursion(x--, y)

Сначала идут вычисления аргументов, а затем вызывается функция test_recursion. НЕТ ???

Почему не хочет нормально работать с постфиксным?

Или инкрементация/декрементация уже проходит в функции? Как это выглядит? В какой момент происходит?

Мегамóзги на месте?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2023, 18:33
Ответы с готовыми решениями:

Передача аргументов в функцию
как передать аргумент в функцию по указателю? нашел только по значению: int sqr(int x); int main() { int t=10; ...

Передача аргументов в функцию
Доброго всем дня! Я немного не понял листинг программы из учебника Р.Лафоре: #include"stdafx.h" ...

передача аргументов в функцию
Всем привет не понимаю что за конченный язык этот javascript и на ем же основанная jquery. есть обычный код который будет работать во...

14
Эксперт PHP
 Аватар для liris
4352 / 997 / 148
Регистрация: 16.01.2023
Сообщений: 2,456
19.01.2023, 18:37
Постфиксный декремент сначала передает в функцию значение, потом только изменяет переменную.
Префиксный декремент сначала изменяет значение, потом передает его в функцию.

В этом различии и смысл этих двух форм.
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
19.01.2023, 18:44
test_recursion(x--, y) - так в следующий вызов test_recursion() будут переданы значения x,y. А x-- уменьшит значения локальной переменной x из текущей копии функции, что не оказывает воздействия на дальнейшее выполнение
0
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 23
19.01.2023, 18:56  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
test_recursion(x--, y) - так в следующий вызов test_recursion() будут переданы значения x,y. А x-- уменьшит значения локальной переменной x из текущей копии функции, что не оказывает воздействия на дальнейшее выполнение
А почему не работает с префиксным?
По идее должно же работать.
0
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 23
19.01.2023, 19:02  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
в следующий вызов test_recursion() будут переданы значения x,y.
Так если x - локальная переменная функции, то она должная уменьшится внутри функции и дальше продолжать как положено.

Добавлено через 37 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
У вас UB.
Что вы имеете ввиду?
0
Заблокирован
19.01.2023, 19:06
Цитата Сообщение от Smolk Посмотреть сообщение
Что вы имеете ввиду?
Да ничего. Показалось.
0
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 23
19.01.2023, 19:08  [ТС]
Подскажите пожалуйста, почему ЭТО не работает?
C++
1
2
3
4
5
6
7
int test_recursion(int x, int y){
    if ((x == 0)||(y == 0)){
        return 1;
    } else {
        return test_recursion(x--, y) + test_recursion(x, y--);
    }
}
Просто ничего не возвращает
0
Эксперт PHP
 Аватар для liris
4352 / 997 / 148
Регистрация: 16.01.2023
Сообщений: 2,456
19.01.2023, 19:17
Похоже оно не выходит из бесконечного цикла?
Допустим вы вызываете функцию как test_recursion(2,2)
Получается, что у вас происходит следующий вызов test_recursion снова с параметрами 2 и 2.
Выходит бесконечный цикл. Аргументы ведь не уменьшились.
0
Заблокирован
19.01.2023, 19:22
Лучший ответ Сообщение было отмечено Smolk как решение

Решение

Цитата Сообщение от Smolk Посмотреть сообщение
Подскажите пожалуйста, почему ЭТО не работает?
Вечная рекурсия.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Сообщение от Smolk
Что вы имеете ввиду?
Да ничего. Показалось.
Хотя нет, таки не показалось :
Code
1
2
3
4
5
6
main.cpp:9:31: warning: unsequenced modification and access to 'x' [-Wunsequenced]
        return test_recursion(--x, y) + test_recursion(x, --y);
                              ^                        ~
main.cpp:9:59: warning: unsequenced modification and access to 'y' [-Wunsequenced]
        return test_recursion(--x, y) + test_recursion(x, --y);
                                   ~                      ^
Добавлено через 4 минуты
Цитата Сообщение от Smolk Посмотреть сообщение
Сообщение от SmallEvil
У вас UB.
Что вы имеете ввиду?
Я имел ввиду Undefined Behavior (UB), неопределенное поведение.
То есть, левая и правая часть оператора "+", могут вычисляться в любом порядке.
1
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 23
19.01.2023, 19:34  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Хотя нет, таки не показалось :
Я уже успел немного прочитать про UB. Теперь понял почему неправильно работало с префиксным. Спасибо вам.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Вечная рекурсия.
А вот с постфиксным немного не понял. Что происходит с x или y? Декрементация игнорируется или...?

Всё, я разобрался. Это не UB. Извилину почесал немного и получилось родить. Спасибо большое.
0
Эксперт PHP
 Аватар для liris
4352 / 997 / 148
Регистрация: 16.01.2023
Сообщений: 2,456
19.01.2023, 19:34
Цитата Сообщение от Smolk Посмотреть сообщение
А вот с постфиксным немного не понял. Что происходит с x или y? Декрементация игнорируется или...?
P.S. Я понимаю, что это тоже UB, но компилятор пропускает, а вывода нету.
Если грубо и примитивно (упростим для понимания), то примерно так.
Префиксная форма test_recursion(--x, y):

C++
1
2
x = x - 1;
test_recursion(x, y);
Постфиксная форма test_recursion(x--, y):

C++
1
2
test_recursion(x, y);
x = x - 1;
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,176
19.01.2023, 19:46
Цитата Сообщение от Smolk Посмотреть сообщение
Всё, я разобрался. Это не UB.
Это называется "разобрался"? Все варианты, которые вы проводили до сих пор - UB. Никакого другого "разобрался" тут быть не может. Как только стало ясно, что это UB, дальше "разбираться" некуда.
2
Заблокирован
19.01.2023, 19:47
Цитата Сообщение от Smolk Посмотреть сообщение
Это не UB.
UB в чистом виде :
Code
1
test_recursion(--x, y) + test_recursion(x, --y);
a + b
Порядок вычисления выражений (a) и (b), не определен (не задан явно), и изменения в одном из них какой то переменной и использования той же переменной в другом выражении - UB.

There is no concept of left-to-right or right-to-left evaluation in C++.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,176
19.01.2023, 19:49
Цитата Сообщение от liris Посмотреть сообщение
Постфиксная форма test_recursion(x--, y):

C++
1
2
test_recursion(x, y);
x = x - 1;
Нет, совершенно не верно. Все побочные эффекты в данном случае должны материализоваться перед вызовом функции, то есть независимо от формы декремента значение x всегда уменьшается ДО вызова функции.

Вариант

C++
1
test_recursion(x--, y):
можно примерно изобразить как

C++
1
2
3
int old_x = x;
x = x - 1;
test_recursion(old_x, y);
но не так, как вы написали.
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
19.01.2023, 20:45
Цитата Сообщение от Smolk Посмотреть сообщение
Привет, изучал рекурсию и обнаружил непонятый для меня момент.
чуваак объясняю один момент:
вычисления проводятся только при входе в рекурсию
и при выходе из рекурсии че тебе не понятно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.01.2023, 20:45
Помогаю со студенческими работами здесь

Передача аргументов в функцию
Добрый день, хочу спросить, стоит ли вот так перегружать функции?: void setX(const int& x); // Для передачи ссылки на переменную ...

Передача аргументов в функцию
При сборке кода выдает ошибку (её я написал в комментарий). Что значит ошибка? #include <iostream> #include <math.h> ...

Передача аргументов в функцию
Привет! Пишу одну программку , и , собственно , уже написал , но код у меня в ней повторяется много , решил попробовать вынести в...

Передача аргументов в функцию
Прошу помощи в разборе багов кода. Ошибка при компиляции связана с неверной передачей аргументов в функцию. Но я никак не пойму , в чём...

Передача аргументов в функцию
Хочу размерность массива задать в отдельной функции, но не получается разобраться с передачей аргументов. Поясните, а то самому пока не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru