Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
#1

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

10.01.2013, 05:27. Просмотров 358. Ответов 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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 05:27     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент.
Посмотрите здесь:
Написал программу, не могу понять правильно или нет C++
Написал программу, но она что-то не совсем то, выдает, не могу понять в чем проблема C++
Const аргумент изменяется C++
Не могу понять почему C++
Не могу понять, почему? C++
Не могу понять почему... C++
C++ Не могу понять почему не вычисляет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
10.01.2013, 06:27     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #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
#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);
}
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 07:16     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #3
для того чтоб изменять параметры внутри функции необходимо передавать их по ссылке
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);
}
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
10.01.2013, 16:15  [ТС]     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #4
Писал в старом топе (Программа рекурсивного нахождения НОД. Не могу понять.), думал что бы не флудить топами, а модераторы сделали отдельный топ - спасибо : -))

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

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

Вообще пытался сделать программку, что бы лучше понять рекурсию. Теоретически я понимаю, но когда дело доходит до практики, сразу путаюсь. Пример - прошлый мой топ, где господин Nixy, полностью разжевал мне код, в котором я запутался.
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 16:51     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #5
Цитата Сообщение от 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;
}
а на что у вас компилятор ругался при объявлении ссылки?, наверно препдоложу в заголовке функции забыли поменять а в реализации поменяли
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
10.01.2013, 18:21  [ТС]     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #6
Цитата Сообщение от 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 ===|
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 18:28     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #7
а если пробел поставить между типом и & возможно он не воспринмает взятие адреса , и да там умножалось на 2 так как произоводилось деление и А и Б на общий делитель а именно 2, там все завязано на 2
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
10.01.2013, 18:51     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #8
Парни, если нужен алгоритм Евклида, то можно реализовать так
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) << " ";
}
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
10.01.2013, 19:08  [ТС]     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #9
Цитата Сообщение от Nixy Посмотреть сообщение
а если пробел поставить между типом и & возможно он не воспринмает взятие адреса
По разному пробовал. На самом деле там были пробелы. Что с пробелами, что без - ошибка идентична. У меня кодблокс, возможно он видит это как ошибку(

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


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

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

Добавлено через 11 минут
Цитата Сообщение от David Sylva Посмотреть сообщение
Парни, если нужен алгоритм Евклида, то можно реализовать так
Скорее нужен не алгоритм Евклида, а понимание самого процесса "2*функция". : )))) Но за код спасибо. Все больше удостоверяюсь что вариантов реализации данного алгоритма очень много.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 20:14     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент.
Еще ссылки по теме:
C++ Не могу понять почему не присваивает?(
ошибка не могу понять почему ! C++
не могу понять,почему не идет C++
Не могу понять почему не запускается C++

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

Или воспользуйтесь поиском по форуму:
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 20:14     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент. #10
ну раз вы такую задачу передсобой ставите то вот
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;
}
попробуйте понять что находит эта рекурсия, и вы сделаете шаг к успеху
Yandex
Объявления
10.01.2013, 20:14     Написал программку с рекурсией. Не могу понять, почему не изменяется аргумент.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru