Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Рекурсия: вычисление выражения - C++

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

Всем доброго времени суток!
Прошу Вашей помощи!
Задание такого: Вычислить, используя рекурсию, выражение:

http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{6+2\sqrt{7+3\sqrt{8+4\sqrt{9+...}}}}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 19:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсия: вычисление выражения (C++):

Рекурсия: вычисление НОД - C++
Даны натуральные числа n,m; найти НОД(n,m). Использовать программу, включающую рекурсивную процедуру вычисления НОД, основанную на...

Рекурсия: вычисление факториала - C++
Здравствуйте! помогите плиз новичку!!! Нужно вычислить факториал числа, полное условие задачки прилагается.

Рекурсия: вычисление суммы ряда - C++
Тема: Рекурсивные функции. используя механизм рекурсии; Вычислить для заданного натурального n: \sum_{i=1}^{n} \frac{{\left(-1...

Рекурсия: вычисление корня n-ой степени - C++
Вот условие А вот то, что я набросал... Прошу исправить... Зарание спасибо: #pragma argsused #include <stdio.h> #include <conio.h>...

Рекурсия: вычисление функции Аккермана - C++
Обчислити рекурсивним методом значення математичної залежності, заданої рекурентною формулою, для довільного значення параметрів. ...

Рекурсия: вычисление чисел Фибоначчи - C++
Числа Фибоначчи Fn вычисляются по формуле F0=F1=1; Fn=Fn-1+Fn-2, при n=2,3,... Нужно реализовать функцию, которая по заданому номеру n...

14
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, что не правильно.. ):
подскажите, пожалуйста, в чем ошибка.
0
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, что не правильно.. ):
подскажите, пожалуйста, в чем ошибка.
0
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 прибавлять новую сумму.
1
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. Для специальных символов используют обратный слэш.
1
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-х..
помогите, пожалуйста!
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
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 и только после этого увеличение каждого из слагаемых на один.

Дальше только проверка условия. Выполнился ли вызов функции столько раз сколько ей сказали. Если нет, то функция каждый раз снова вызывает себя, если же вызов функции выполнился сколько нужно, то выводится только то значение, которое нужно
1
zss
Модератор
Эксперт С++
6540 / 6102 / 2010
Регистрация: 18.12.2011
Сообщений: 15,878
Завершенные тесты: 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");
}
1
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 заменить просто условием, как у меня.. что до тех пор, пока какая-то переменная будет меньше, то запустить функцию ещё раз?
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
21.05.2012, 19:48 #10
а можно этот count заменить просто условием, как у меня.. что до тех пор, пока какая-то переменная будет меньше, то запустить функцию ещё раз?
Вы должны как-то считать сколько раз выполнилась функция. Этот count как раз и считает.
смотрите. у вас написано if (a<8) здесь a - это и есть счетчик count
Если вам по каким-то причинам не нравится count, то просто напишите вместо него a

хм. у меня работает
C++
1
rec(2,6,8); // if a<8
1
Миниатюры
Рекурсия: вычисление выражения  
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 19:57  [ТС] #11
zss
а что в Вашем коде значит if(n==1)return sqrt(6.+sum); подскажите, пожалуйста.
0
zss
Модератор
Эксперт С++
6540 / 6102 / 2010
Регистрация: 18.12.2011
Сообщений: 15,878
Завершенные тесты: 1
21.05.2012, 20:19 #12
Цитата Сообщение от intnower Посмотреть сообщение
zss
а что в Вашем коде значит if(n==1)return sqrt(6.+sum); подскажите, пожалуйста.
У рекурсивных функций обязательно должно присутствовать условие завершения рекурсии.
Вот это оно и есть.
1
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 эти убрать, то получается что-то странное (:
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
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
1
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 21:14  [ТС] #15
daslex
спасибо большое за помощь!
0
21.05.2012, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2012, 21:14
Привет! Вот еще темы с ответами:

Рекурсия: вычисление суммы ряда 1/n! - C++
Здравствуйте) Есть задача, чтобы сделать её с рекурсией и без. Вычислить значение суммы S = 1/1! + 1/2! + ... + 1/k! Без рекурсии я...

Рекурсия: вычисление значения цепной дроби - C++
помогите пожалуста решить задачу с использованием рекурсивной и обычной функций.

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

Рекурсия для вычисления выражения - C++
Для данного N вычислить значение выражения, используя рекурсию s= sqrt(7+sqrt(14+sqrt(21+...+sqrt(7*N))))


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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