Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2015, 21:57   #31
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
float recursion(int N)
{
    if (N == 0) return 0;
    float a = 1 / (N * sqrt(N + 1));
    printf("\n%f", a);
    return a + recursion(N - 1);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.06.2015, 22:41   #32
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

точно, спасибо огромное!

Ребят, а как вычислить число Pi? при помощи формулы

(4/1)-(4/3)+(4/5)-(4/7)...;


интересуют:
1) реализация чередования + и -, есть идея bool запихнуть в параметр функции, но может можно проще?
2) почему поток выводит целое число от деления на второй (итерации (?))


Код:
#include <iostream>



float Pi(int N)
{
float a=4/N;

    std::cout<<a<<std::endl;
    if (N<=21) return a+ Pi(N+2);
}


int main()
{
    std::cout<<Pi(1);
    return 0;
}
from dark to light)

Последний раз редактировалось Вадим Мошев; 19.07.2015 в 00:57.
Алексей_2012 вне форума Ответить с цитированием
Старый 18.07.2015, 23:57   #33
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
using namespace std;

float Pi(int N)
{
    float a = 4.0 / N;
    cout << a << endl;
    if (abs(N) >= 20)
        return 0;
    return a + Pi(-N + ((N > 0) ? -2 : 2));
}

int main()
{
    cout << Pi(1);
    return 0;
}
Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
почему поток выводит целое число от деления на второй
4/N - целое делить на целое - результат целое
4.0/N - вещественное делить на целое - результат вещественное
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.07.2015, 01:33   #34
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

BDA, извините, но:

Код:
   return a + Pi(-N + ((N > 0) ? -2 : 2));
что это такое?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 19.07.2015, 02:06   #35
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Как что
Возврат суммы "a" и результата вызова функции "Pi". Используется тернарный оператор. Если N было положительным, то произойдет вызов со значением -N-2, если N было отрицательным, то -N+2.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.07.2015, 02:20   #36
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

спасибо, прочитал об этом операторе

Ребят, вот еще вопрос, почему при использовании кода без рекурсии программа неожиданно не завершается, а вот если в рекурсии поставить такое же значение, как у переменной i в коде ниже, и заменить float на double, а int на long - то работу программы виндос завершит через некоторое время.

Код:
#include <iostream>



int main()
{


    double summ=0;
    bool ok=false;

    for (long i=1;i<100000000;i+=2)
    {

        if (!ok)
        {
            summ+=4.0/i;
            ok=true;
        }
        else
        {
            summ-=4.0/i;
            ok=false;
        }

        std::cout<<summ<<std::endl;

    }


    std::cout<<"Itogo: "<<summ<<std::endl;


    return 0;
}
з.ы.: а что лучше использовать :

Код:
...<<std::endl; //или: 

using namespace std;

...<<endl;
?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 19.07.2015, 02:24   #37
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

з.з.ы...да-да, цикл ждал долго

но почему-то всего 5 знаков выводится после запятой

со знаками разобрался

Код:
   std::cout << std::fixed << std::setprecision(25) <<summ<<std::endl;
from dark to light)

Последний раз редактировалось Алексей_2012; 19.07.2015 в 02:41.
Алексей_2012 вне форума Ответить с цитированием
Старый 19.07.2015, 03:47   #38
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

и еще вопрос, почему-то не работает вычисление основания натурального логарифма при помощи формулы где число "е" представляется как произведение. т.е. выводится не достаточно точный результат.

Плюс если в аргумент функции поставлю число большее, чем число 71-то результат-0.




Код:
#include <iostream>
#include <math.h>


double  exponent(long k)
{
    double chislitel1,chislitel2,znaminatel;


    chislitel1= pow(((2.0*k)+3),(k+0.5));
    chislitel2=pow(((2.0*k)-1),(k-0.5));
    znaminatel=pow(((2.0*k)+1),(2*k));


    double  a=(chislitel1*chislitel2)/znaminatel;
    if (k==0) return 1;
    return a*exponent(k-1);
}




int main()
{
    std::cout<<(sqrt(3)*exponent(71))<<std::endl;
    return 0;
}
Хотел написать при помощи суммы ряда, но вычисление факториала при помощи рекурсии и деление этого всего на 1 на каждой итерации показалось мне слишком сложным
Изображения
Тип файла: jpg Безымянный.jpg (12.8 Кб, 109 просмотров)
from dark to light)

Последний раз редактировалось Алексей_2012; 19.07.2015 в 03:50.
Алексей_2012 вне форума Ответить с цитированием
Старый 19.07.2015, 04:16   #39
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Как вариант, использовать long double вместо double. Это решит проблему, если в функцию передавать число больше чем 71 и возможно результат будет точнее.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 19.07.2015, 04:20   #40
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

там дело не только в переполнении как я понял
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсия Ника-Вероника Паскаль, Turbo Pascal, PascalABC.NET 6 23.03.2012 21:43
Рекурсия unbanned Паскаль, Turbo Pascal, PascalABC.NET 7 19.01.2012 11:25
Рекурсия dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 4 29.08.2010 14:14
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
Рекурсия Shadows_Behind Помощь студентам 6 26.05.2010 15:07