Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
intnower
0 / 0 / 2
Регистрация: 12.01.2012
Сообщений: 68
#1

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

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


http://www.cyberforum.ru/cpp-beginners/thread283725.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 19:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Рекурсия: вычисление выражения (C++):

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

Рекурсия: вычисление элементов ряда
Вычислить элементы ряда с помощью рекурсивной функции. Порядок вычисления...

Рекурсия: вычисление двойного факториала
Составить прогруамму для вычисления , где , для вычисления n!!, использовать...

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

Рекурсия: вычисление n-го члена последовательности
Требуется разработать рекурсивную функцию, возвращающую значение для вычисления...

14
intnower
0 / 0 / 2
Регистрация: 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 / 2
Регистрация: 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 / 16
Регистрация: 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 / 3
Регистрация: 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 / 2
Регистрация: 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
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
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
Модератор
Эксперт С++
6952 / 6514 / 4135
Регистрация: 18.12.2011
Сообщений: 17,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");
}
1
intnower
0 / 0 / 2
Регистрация: 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
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
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 / 2
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 19:57  [ТС] #11
zss
а что в Вашем коде значит if(n==1)return sqrt(6.+sum); подскажите, пожалуйста.
0
zss
Модератор
Эксперт С++
6952 / 6514 / 4135
Регистрация: 18.12.2011
Сообщений: 17,179
Завершенные тесты: 1
21.05.2012, 20:19 #12
Цитата Сообщение от intnower Посмотреть сообщение
zss
а что в Вашем коде значит if(n==1)return sqrt(6.+sum); подскажите, пожалуйста.
У рекурсивных функций обязательно должно присутствовать условие завершения рекурсии.
Вот это оно и есть.
1
intnower
0 / 0 / 2
Регистрация: 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
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
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 / 2
Регистрация: 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
Привет! Вот еще темы с решениями:

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

Рекурсия: вычисление цифрового корня
Ваша задача — написать функцию вычисления цифрового корня. Цифровой корень...

Рекурсия: вычисление биномиального коэффициента
Описать функцию С(m,n), где 0&lt;=m&lt;=n, для вычисления биномиального коэффициента...

Рекурсия: вычисление n-го члена последовательности
Разработать рекурсивную функцию, возвращающую значение , для вычисления n-го...


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

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

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