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

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

10.01.2013, 05:27. Показов 1146. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru