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

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

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

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

18.05.2012, 19:09. Просмотров 1012. Ответов 14
Метки нет (Все метки)

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

Рекурсия - C++
Здравствуйте, писали на лабораторной программу с использованием рекурсии, о бъясните почему в ответе двойки выдает?? и что рекурсивная...

Рекурсия - C++
Помогите пожалуйста составить программу, с помощью рекурсии: Определить значение отношения максимального и минимального из...

рекурсия на с - C++
разработать рекурсивную функцию для вычитания двух подлинных двоичных чисел, заданных в виде символьных строк. разрядность цифр может быть...

Рекурсия - C++
Привет, помогите пожалуйста надо вычислить рекурсивную функцию : (x+a(x+(a-1)(x+(a-2)(x+...2(x+1)^2)^2)^2)^2)^2. Помогите пожалуйста ,...

Рекурсия - C++
Задан массив целых чисел: а0, а1 ..., аn-1. Известно, что один из элементов массива принимает нулевое значение. Найти номер данного...

рекурсия - 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
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
31 / 31 / 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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
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
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
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
Модератор
Эксперт С++
6358 / 5922 / 1920
Регистрация: 18.12.2011
Сообщений: 15,220
Завершенные тесты: 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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
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
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 21:14  [ТС] #15
daslex
спасибо большое за помощь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2012, 21:14
Привет! Вот еще темы с ответами:

Рекурсия - C++
Вопрос не по коду. Вот есть у меня рекурсивная функция, глубина рекурсии достигает 10 в среднем. Эта функция вызывается огромное (порядка...

Рекурсия - C++
Есть задача, написал решение но ответ неправильный. Задача: Решение: #include &lt;iostream&gt; using namespace std; int a, n, m, t,...

рекурсия - C++
Доброго времени суток. Уважаемые ГУРУ, есть одна проблема. Ниже представлен код, в котором параметр b должен быть всегда...

Рекурсия - C++
В общем нужно вывести биноминальные коэффициенты последовательности.... т.е есть последовательность - скажем вектор 12345 n = size =...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.05.2012, 21:14
Ответ Создать тему
Опции темы

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