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

Рекурсия - C++

Восстановить пароль Регистрация
 
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
18.05.2012, 19:09     Рекурсия #1
Всем доброго времени суток!
Прошу Вашей помощи!
Задание такого: Вычислить, используя рекурсию, выражение:
//и вот собственно выражение:
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 19:09     Рекурсия
Посмотрите здесь:

Рекурсия C++
C++ рекурсия
Рекурсия C++
Рекурсия C++
Рекурсия C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
18.05.2012, 19:13  [ТС]     Рекурсия #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>
#include <windows.h>
#include <math.h>
using namespace std;
int s;
int a=6, b=2;
 
int Q ( int a, int b )
    {
        int sum=0;
            sum+=(a*b); 
            ++a;
            ++b;
            return sum;
        if (a<8) //для того, чтобы не было бесконечности, Я ввёл условие.
            sum+=Q (a, b); //здесь функция-то и вызывает саму себя и складывает предыдущее значение, т.е сначала sum=0 мы прибавили произведение а и b, потом к этому произведению прибавляем следующее.. и так до тех пор, пока а не станет равное 7..
    }
        
int main ()
{
s = Q (a, b);
cout << "Сумма равна = " << '/t' << s << endl;
system("PAUSE");
}
Но при выводе выдает значение: 1214812, что не правильно.. ):
подскажите, пожалуйста, в чем ошибка.
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
20.05.2012, 13:09  [ТС]     Рекурсия #3
Всем доброго времени суток!
Прошу Вашей помощи!
Задание такого: Вычислить, используя рекурсию, выражение:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{6+2\sqrt{7+3\sqrt{8+4\sqrt{9+...}}}}

Я просто убрал эти корни, для того, чтобы реально было посчитать и убедиться в правильности кода.
И вот, что у меня получилось:

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>
#include <windows.h>
#include <math.h>
using namespace std;
int s;
int a=6, b=2;
 
int Q ( int a, int b )
    {
        int sum=0;
            sum+=(a*b); 
            ++a;
            ++b;
            return sum;
        if (a<8) //для того, чтобы не было бесконечности, Я ввёл условие.
            sum+=Q (a, b); //здесь функция-то и вызывает саму себя и складывает предыдущее значение, т.е сначала sum=0 мы прибавили произведение а и b, потом к этому произведению прибавляем следующее.. и так до тех пор, пока а не станет равное 7..
    }
        
int main ()
{
s = Q (a, b);
cout << "Сумма равна = " << '/t' << s << endl;
system("PAUSE");
}
Но при выводе выдает значение: 1214812, что не правильно.. ):
подскажите, пожалуйста, в чем ошибка.
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.05.2012, 13:40     Рекурсия #4
C++
1
'/t'
для спец. символов используется обратный слэш, т.е нужно так:
C++
1
'\t'
Да и еще, у вас ф-я Q выполнится 1 раз: посчитается сумма и ф-я возратит значение в точку вызова(т.е сюда:s = Q (a, b)). Так же в Q параметром нужно передавать предыдущую сумму, иначе каждый раз будет к 0 прибавлять новую сумму.
Endiff
 Аватар для Endiff
30 / 30 / 1
Регистрация: 19.05.2012
Сообщений: 67
20.05.2012, 13:52     Рекурсия #5
Во-первых, функция выполнится только один раз, т.к. при первом же выполнении возвращается sum. И как сказал Зорт, при каждом вызове функции у тебя переменная sum определяется нулем, что не есть хорошо. Её надо сделать статической, т.е.
C++
1
static int sum( 0 );
Думаю, что в конце функции и надо как раз возвращать значение рекурсией
C++
1
return Q( a, b );
а
C++
1
return sum;
убрать к чертям
Если есть ошибочка - прошу подправить
P.S. Для специальных символов используют обратный слэш.
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 17:33  [ТС]     Рекурсия #6
Endiff Сделал, как Вы написали, у меня получается результат = 4 (при условии а<8.. если Я поставлю a<9, то будет результат =5).

Вот так вроде что-то более или менее близко к ожидаемому результату:
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
28
29
30
31
#include <iostream>
#include <windows.h>
#include <math.h>
using namespace std;
int s;
const int a=6;
const int b=2;
int sum=6;
 
int Q ( int a, int b, int sum )
    {
            sum+=(b*(a+1));
            ++a;
            ++b;
                if (a<8)
                    sum+= Q (a, b, sum );
/*получается, что если а<8,
то идем по ветке "да" и снова заходим в функцию..
и так будет до тех пор, пока условие (a<8) не будет выполнятся. 
Когда это произойдет, мы пойдем по ветке "нет" и выполнится return sum.*/
                return sum;
    }
        
int main ()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
s = Q (a, b, sum );
cout << "Сумма равна = " << '\t' << s << endl;
system("PAUSE");
}
В итоге получается 64.. а должно быть 44.. ):
если Я ставлю условие а<7, то ответ правильный, а вот если больше семи(например 8), получается 64 вместо 44-х..
помогите, пожалуйста!
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
21.05.2012, 18:02     Рекурсия #7
Решение задачи

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <math.h>
using namespace std;
 
double rec(double i,double k,int N)
{   
     static int count=0;
         count++; //При каждом вызове увеличиваем счетчик вызовов функции
     double sum=sqrt(i+k); //Корень суммы двух слагаемых     
     i++;k++;        //Меняем значения слагаемых для будущих вычислений
     if (count<N) return sqrt(rec(i,k,N))*sum; //Рекурсивный вызов нужное число раз
     else return sum; //Вывод окончательного результата
}
 
void main()
{   int x,y,N; //Первое слагаемое, второе слагаемое и количество вызовов функции
    cin>>x>>y>>N; //Вводим нужные данные
    cout<<rec(x,y,N)<<'\n'; //Расчет и вывод результата на экран
 system("PAUSE");
}
Для того чтобы функция знала когда остановится внутри функции объявлена статическая переменная count. Являясь локальной действует она только внутри функции, но ведет себя внутри этой функции как глобальная.
При произведении расчета нужно осознавать, что только после необходимых вычислений нужно менять слагаемые. Поэтому сначала вычисление корня и запоминание этого в sum и только после этого увеличение каждого из слагаемых на один.

Дальше только проверка условия. Выполнился ли вызов функции столько раз сколько ей сказали. Если нет, то функция каждый раз снова вызывает себя, если же вызов функции выполнился сколько нужно, то выводится только то значение, которое нужно
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,179
Завершенные тесты: 1
21.05.2012, 18:28     Рекурсия #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <math.h>
using namespace std;
double Q( int n,double sum)
{
    if(n==1)return sqrt(6.+sum);
    sum=n*sqrt(n+5.+sum);
    return Q(n-1,sum);
}
int main ()
{
    setlocale(LC_ALL,"rus");
    double s = Q (4,0);// 4 - к-во членов, 0 - начальное значение суммы
    cout << "Сумма равна = \t"<< s << endl;
    system("PAUSE");
}
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 19:27  [ТС]     Рекурсия #9
Цитата Сообщение от daslex Посмотреть сообщение
Решение задачи

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <math.h>
using namespace std;
 
double rec(double i,double k,int N)
{   
     static int count=0;
         count++; //При каждом вызове увеличиваем счетчик вызовов функции
     double sum=sqrt(i+k); //Корень суммы двух слагаемых     
     i++;k++;        //Меняем значения слагаемых для будущих вычислений
     if (count<N) return sqrt(rec(i,k,N))*sum; //Рекурсивный вызов нужное число раз
     else return sum; //Вывод окончательного результата
}
 
void main()
{   int x,y,N; //Первое слагаемое, второе слагаемое и количество вызовов функции
    cin>>x>>y>>N; //Вводим нужные данные
    cout<<rec(x,y,N)<<'\n'; //Расчет и вывод результата на экран
 system("PAUSE");
}
Для того чтобы функция знала когда остановится внутри функции объявлена статическая переменная count. Являясь локальной действует она только внутри функции, но ведет себя внутри этой функции как глобальная.
При произведении расчета нужно осознавать, что только после необходимых вычислений нужно менять слагаемые. Поэтому сначала вычисление корня и запоминание этого в sum и только после этого увеличение каждого из слагаемых на один.

Дальше только проверка условия. Выполнился ли вызов функции столько раз сколько ей сказали. Если нет, то функция каждый раз снова вызывает себя, если же вызов функции выполнился сколько нужно, то выводится только то значение, которое нужно
спасибо большое за помощь!
но при вводе N больше единицы, программа просто отказывается работать ):
а можно этот count заменить просто условием, как у меня.. что до тех пор, пока какая-то переменная будет меньше, то запустить функцию ещё раз?
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
21.05.2012, 19:48     Рекурсия #10
а можно этот count заменить просто условием, как у меня.. что до тех пор, пока какая-то переменная будет меньше, то запустить функцию ещё раз?
Вы должны как-то считать сколько раз выполнилась функция. Этот count как раз и считает.
смотрите. у вас написано if (a<8) здесь a - это и есть счетчик count
Если вам по каким-то причинам не нравится count, то просто напишите вместо него a

хм. у меня работает
C++
1
rec(2,6,8); // if a<8
Миниатюры
Рекурсия  
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 19:57  [ТС]     Рекурсия #11
zss
а что в Вашем коде значит if(n==1)return sqrt(6.+sum); подскажите, пожалуйста.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,179
Завершенные тесты: 1
21.05.2012, 20:19     Рекурсия #12
Цитата Сообщение от intnower Посмотреть сообщение
zss
а что в Вашем коде значит if(n==1)return sqrt(6.+sum); подскажите, пожалуйста.
У рекурсивных функций обязательно должно присутствовать условие завершения рекурсии.
Вот это оно и есть.
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 20:20  [ТС]     Рекурсия #13
Цитата Сообщение от daslex Посмотреть сообщение
Вы должны как-то считать сколько раз выполнилась функция. Этот count как раз и считает.
смотрите. у вас написано if (a<8) здесь a - это и есть счетчик count
Если вам по каким-то причинам не нравится count, то просто напишите вместо него a

хм. у меня работает
C++
1
rec(2,6,8); // if a<8
а если sqrt эти убрать, то получается что-то странное (:
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
21.05.2012, 20:46     Рекурсия #14
А зачем вам убирать? Это квадратные корни для решения задачи по теме.

Если нужно вычислить что-то типа (6+2)(7+3)(8+4)... - то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include "iostream"
#include "cstdlib"
using namespace std;
 
double Q(double x,double y,int N)
{
 static int a=0;
 a++;
 double  sum=x+y; //
 x++;y++;
 if (a<N) return Q(x,y,N)*sum; 
 else return sum;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
     cout<<Q(6,2,3); //if a<3
     system("PAUSE");
    return 0;
}
(6+2)(7+3)(8+4)=960
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2012, 21:14     Рекурсия
Еще ссылки по теме:

Рекурсия C++
C++ Рекурсия
C++ Рекурсия

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

Или воспользуйтесь поиском по форуму:
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 21:14  [ТС]     Рекурсия #15
daslex
спасибо большое за помощь!
Yandex
Объявления
21.05.2012, 21:14     Рекурсия
Ответ Создать тему
Опции темы

Текущее время: 14:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru