С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113

Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент.

10.01.2013, 05:27. Показов 1100. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Еще раз здравствуйте. Днем будучи в очереди которая затянулась на 2 часа, решил побаловаться с кодом. Написал программку(если ее так можно назвать)) с рекурсией, вроде должно работать... Когда ввожу аргумент, который проходит рекурсию, по идее должен изменится, но в итоге остается прежним. Может кто-то подсказать, почему аргумент который возвращается не умножается? Возможно что-то делаю не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
 
using namespace std;
 
int rekyrsia(int, int);
 
int main()
{
    int a,b=5;
    cout << "Enter number: ";
    cin >> a;
    cout << endl;
 
    rekyrsia(a,b);
    cout << "Total: ";
    cout << a;
   return 0;
}
 
int rekyrsia(int a, int b)
{
if (b == 0)
return 1;
 
else
return 2 * rekyrsia(a,b-1);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2013, 05:27
Ответы с готовыми решениями:

Не могу понять почему массив самостоятельно изменяется
Доброго времени суток, суть проблемы такова: Есть 2 массива, один мы используем для промежуточных вычислений(arr3), а 2й для записи...

Сортировка Шелла. Написал программу, не могу понять, почему сортировка не выполняется
Программа создает динамический массив с рандомным заполнением. Дальше выбор сортировок, пузырьком или сортировка Шелла. Вот она то и не...

Написал код, но не могу понять где ошибка :[
type TForm3 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; Button2: TButton; Button3:...

9
387 / 214 / 102
Регистрация: 09.04.2012
Сообщений: 635
10.01.2013, 06:27
Результат, возвращаемый функцией уходит в никуда.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
 
using namespace std;
 
int rekyrsia(int, int);
 
int main()
{
    int a,b=5;
    cout << "Enter number: ";
    cin >> a;
    cout << endl;    
    cout << "Total: ";
    cout << rekyrsia(a,b);;
   return 0;
}
 
int rekyrsia(int a, int b)
{
if (b == 0)
return 1; 
else
return 2 * rekyrsia(a,b-1);
}
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 07:16
для того чтоб изменять параметры внутри функции необходимо передавать их по ссылке
C++
1
int rekyrsia(int &, int &);
Добавлено через 2 минуты
Цитата Сообщение от asidorchenko Посмотреть сообщение
Результат, возвращаемый функцией уходит в никуда.
вы не уловили суть
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Когда ввожу аргумент, который проходит рекурсию, по идее должен изменится
и чтоб изменялся аргумент его нужно изменять в теле функции
C++
1
2
3
4
5
6
7
int rekyrsia(int &a, int &b)
{
 if (b == 0)
  return 1; 
 else
  return a = 2 * rekyrsia(a,b-1);
}
0
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
10.01.2013, 16:15  [ТС]
Писал в старом топе (Программа рекурсивного нахождения НОД. Не могу понять.), думал что бы не флудить топами, а модераторы сделали отдельный топ - спасибо : -))

Цитата Сообщение от asidorchenko Посмотреть сообщение
Результат, возвращаемый функцией уходит в никуда.
Я понял о чем вы. И понял где я сглупил. Единственное, получается что моя функция каким-то образом не правильно считает. Пытался поменять return 1 на return а, итоге результат аналогичен. К примеру ввожу 32 - выдает 0.
Если return 1, то по идее должно при аргументе b=5 вернуть нам 16.

Цитата Сообщение от Nixy Посмотреть сообщение
для того чтоб изменять параметры внутри функции необходимо передавать их по ссылке
Бесценна информация, про которую я не знал :) Единственное компилятор ругается. Может быть что это из-за среды ?

Вообще пытался сделать программку, что бы лучше понять рекурсию. Теоретически я понимаю, но когда дело доходит до практики, сразу путаюсь. Пример - прошлый мой топ, где господин Nixy, полностью разжевал мне код, в котором я запутался.
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 16:51
Цитата Сообщение от IvanInanovich Посмотреть сообщение
господин Nixy
господ отпенили еще в 19 веке, у вас в алгоритме ошибка, для нахождения НОД Евклидом необходимо менять местами аргументы,если 1 больше другого, + возвращение не 2*на нод(а,а-б), так как в предыдушем топике был бинарный алгоритм, то там во 1 смотрелись степени 2, а умножение на 2 было за счет того что и а и б делили на 2,вот код классического алгоритма Евклида
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream.h>
#include "windows.h"
 
using namespace std;
 
int NOD(int a, int b)
{
    if (b == 0 )    return a;
    if (a == 0 )    return b;
 
    if (a > b) {
       return NOD(a-b,b);
    }  else {
        return NOD(a,b-a);
    }
}
 
int main()
{
    int a,b=24;
    cout << "Enter number: ";
    cin >> a;
    cout << endl;
    cout << "Total: ";
    cout << NOD(a,b);
   return 0;
}
а на что у вас компилятор ругался при объявлении ссылки?, наверно препдоложу в заголовке функции забыли поменять а в реализации поменяли
0
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
10.01.2013, 18:21  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
у вас в алгоритме ошибка, для нахождения НОД Евклидом необходимо менять местами аргументы,если 1 больше другого, + возвращение не 2*на нод(а,а-б), так как в предыдушем топике был бинарный алгоритм, то там во 1 смотрелись степени 2, а умножение на 2 было за счет того что и а и б делили на 2,вот код классического алгоритма Евклида
Благодарю за код. Делал такой же на вычитание, правда с помощью циклов. Ну тут я все без проблем понимаю.
Т.е. Вы хотите сказать, что в прошлом коде (бинарном) умножалась единица на 2, из-за того что там было деление до этого?
После вашего объяснения в прошлом топе, я был уверен что я понял что такое "2 * функция". Теперь снова запутался ) В данном случае, я пытался сделать "породию" на бинарный код, а именно на строку(2*NOD(х/2,y/2) что бы понять как работает "2*функция". Я полагал, что и тут пойдет обратный ход рекурсии. Как только программа нащупает ноль, пойдет реторн единица, и будет эта единица умножаться на 2, ровно 5 раз.

а на что у вас компилятор ругался при объявлении ссылки?, наверно препдоложу в заголовке функции забыли поменять а в реализации поменяли
Вроде все указал. И в прототипе, и в самой функции. Вот что показало:

2012\MyFistProject\main.cpp||In function 'int rekyrsia(int&, int&)':|
2012\MyFistProject\main.cpp|25|error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'|
2012\MyFistProject\main.cpp|19|error: in passing argument 2 of 'int rekyrsia(int&, int&)'|
||=== Build finished: 2 errors, 0 warnings ===|
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 18:28
а если пробел поставить между типом и & возможно он не воспринмает взятие адреса , и да там умножалось на 2 так как произоводилось деление и А и Б на общий делитель а именно 2, там все завязано на 2
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
10.01.2013, 18:51
Парни, если нужен алгоритм Евклида, то можно реализовать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
 
int gcd(int m, int n) 
{ 
    if( n == 0) return m; 
    return gcd(n, m % n); 
} 
 
int main() 
{ 
    int n = 15, m = 25; 
    std::cout << gcd(n, m) << " ";
}
0
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
10.01.2013, 19:08  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
а если пробел поставить между типом и & возможно он не воспринмает взятие адреса
По разному пробовал. На самом деле там были пробелы. Что с пробелами, что без - ошибка идентична. У меня кодблокс, возможно он видит это как ошибку(

да там умножалось на 2 так как произоводилось деление и А и Б на общий делитель а именно 2, там все завязано на 2
Понял. Странно конечно как по мне. Пока изучаю программирование, единственное что вводит в ступор, это вот рекурсия подобного типа. Попробую еще что-то похожее создать, для лучшего "усвоения" и "переваривания".


Вот еще кусочек кода из википедии:
int factorial (int n) {
if (n == 0) return 1;
else return n * factorial(n - 1);
}

Скажите, тут тоже рекурсия сперва "проделает" свой путь, после чего "пойдет обратно" и будет умножать единицу на n?

Добавлено через 11 минут
Цитата Сообщение от David Sylva Посмотреть сообщение
Парни, если нужен алгоритм Евклида, то можно реализовать так
Скорее нужен не алгоритм Евклида, а понимание самого процесса "2*функция". : )))) Но за код спасибо. Все больше удостоверяюсь что вариантов реализации данного алгоритма очень много.
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 20:14
ну раз вы такую задачу передсобой ставите то вот
C++
1
2
3
4
5
6
7
8
9
int recursion(const int* arr,int size){
      int mult = 1;
      if(size){
        mult *= arr[size-1]*recursion(arr,size--);   
      }else{
        return 1;
      }
 return mult;
}
попробуйте понять что находит эта рекурсия, и вы сделаете шаг к успеху
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2013, 20:14
Помогаю со студенческими работами здесь

Написал программу, не могу понять правильно или нет
Написать функцию sum с переменным числом параметров, которая находит сумму чисел типа int по формуле: S=a1*a2+a2*a3+a3*a4+. . . . . ...

Написал программу, но она что-то не совсем то, выдает, не могу понять в чем проблема
При х=3, y= -6 после выполнения фрагмента алгоритма 1. если y&lt;x, то y=y+x 2.если y&lt;0, то y=-y 3. если x&lt;0, то a=x*2 иначе...

Не могу понять почему не могу считать символьный ряд через cin.getline
Не могу понять почему не могу считать символьный ряд через cin.getline.Помогите позязя. #define _CRT_SECURE_NO_WARNINGS #include...

написал небольшую программку и возникла п р о б л е м м к а
как сделать так, чтобы когда я вставлял флешку то она сама добавлялась в автозагрузку ми скрывалась от диспетчера задач???

Не могу понять, почему программа работает неправильно( Знаю, что где-то ошибки, но не могу найти
{Ввести последовательность натуральных чисел Aj j=1...n (n&lt;=1000). Упорядочить последовательность по неубыванию наименььшей цифры...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru