Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68

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

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

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

https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{6+2\sqrt{7+3\sqrt{8+4\sqrt{9+...}}}}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2012, 19:09
Ответы с готовыми решениями:

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

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

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

14
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
18.05.2012, 19:13  [ТС]
Я просто убрал эти корни, для того, чтобы реально было посчитать и убедиться в правильности кода.
И вот, что у меня получилось:
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
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
20.05.2012, 13:09  [ТС]
Всем доброго времени суток!
Прошу Вашей помощи!
Задание такого: Вычислить, используя рекурсию, выражение:
https://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
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
20.05.2012, 13:40
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
Во-первых, функция выполнится только один раз, т.к. при первом же выполнении возвращается sum. И как сказал Зорт, при каждом вызове функции у тебя переменная sum определяется нулем, что не есть хорошо. Её надо сделать статической, т.е.
C++
1
static int sum( 0 );
Думаю, что в конце функции и надо как раз возвращать значение рекурсией
C++
1
return Q( a, b );
а
C++
1
return sum;
убрать к чертям
Если есть ошибочка - прошу подправить
P.S. Для специальных символов используют обратный слэш.
1
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 17:33  [ТС]
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
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
21.05.2012, 18:02
Решение задачи

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
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
21.05.2012, 18:28
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
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 19:27  [ТС]
Цитата Сообщение от 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
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
21.05.2012, 19:48
а можно этот count заменить просто условием, как у меня.. что до тех пор, пока какая-то переменная будет меньше, то запустить функцию ещё раз?
Вы должны как-то считать сколько раз выполнилась функция. Этот count как раз и считает.
смотрите. у вас написано if (a<8) здесь a - это и есть счетчик count
Если вам по каким-то причинам не нравится count, то просто напишите вместо него a

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

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

Если нужно вычислить что-то типа (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
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
21.05.2012, 21:14  [ТС]
daslex
спасибо большое за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2012, 21:14
Помогаю со студенческими работами здесь

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

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

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

Рекурсия: вычисление чисел Каталана
Числами Каталана Сn(n=0,1,2,...) называються числа 1,1,2,5,14,42,132,429,... Числа Каталана являються решением рекуррентного уравнения ...

Рекурсия: вычисление n-го члена последовательности
Разработать рекурсивную функцию, возвращающую значение , для вычисления n-го члена последовательности b1 =5, bn+1=bn/(n2+n+1). Не знаю...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru