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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2015, 22:50   #51
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вообще не вижу логики в этом коде. На бумажке с карандашом проследи что делает эта функция
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.10.2015, 23:28   #52
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Код:
 int main()
{

     cout << recursion(5);

    return 0;
}
почему нет логики?

сначала получается так:

5/6. Если введенное число меньше равно нулю, то возвращаем 1/, если нет, то к вычисленному а прибавляем результат от (Числа - 1), т.е. получеатся:

5/6+4/5+3/4+2/3+1/2+1

Так тоже не работает


Код:
#include <iostream>

using namespace std;

float recursion (int chislo)
{

 float a=chislo/(chislo+1);

    if (chislo>=1) return a+recursion(chislo-1);
}

 int main()
{

     cout << recursion(5);

    return 0;
}
from dark to light)

Последний раз редактировалось Stilet; 24.10.2015 в 18:57.
Алексей_2012 вне форума Ответить с цитированием
Старый 24.10.2015, 04:53   #53
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1) int делить на int в результате даст int.
2) Последний вызов функции ничего не вернет - в результате общая сумма nan.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.10.2015, 09:03   #54
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Ну в первом вопросе int на float.

А во втором? Чтоб убрать nan - нужно в условии поставить >=2
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 24.10.2015, 10:01   #55
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Алексей_2012
Ты пишешь рекурсивные функции неправильно.
Посмотри статью про анализ рекурсивных алгоритмов, там есть большое количество примеров. Если ты внимательно посмотришь эти примеры, то заметишь, что в рекурсивной функции всегда выделяется условие, при котором задача решается без рекурсивного вызова (тривиальное решение). Если такого условия нет, то рекурсия будет бесконечной.

Т.е. я вот беру код из первого поста:

Код:
int rabbits (int mounth)
{
    if (mounth<3) // условие тривиального решения
      return 1;  // тривиальное решение
    else // если задача не решается "сразу", то выполняем рекурсивные вызовы
        return
                rabbits(mounth-1)+
                rabbits(mounth-2);
    
}
Рекурсивные вызовы внутри рекурсивной функции должны выполняться над более простой задачей (над меньшим объемом данных). Ты можешь проследить это в куче примеров по ссылке или вот в твоем примере:
вызов rabbits(mounth-1) более простой, чем изначальный rabbits(mounth), т.к. объем данных сократился на единицу.

Ты явно не разобрался с этим, т.к. вот последний твой код:
Код:
float recursion (int chislo) {
 float a=chislo/(chislo+1);
 if (chislo>=1) return a+recursion(chislo-1);
}
Не содержит никакого нерекурсивного решения. Твоя функция тут вообще ничего не возвращает если chislo < 1. Ничего не возвращает, но должна вернуть дробное число и в этом ошибка.

Вобщем посмотри примеры рекурсивных функций и попробуй найти в них что-то общее. Для начала.
rrrFer вне форума Ответить с цитированием
Старый 24.10.2015, 18:53   #56
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Окей, вроде переделал...работает, можно ли сделать лучше? Притом так, чтоб в параметрах функции было число типа int?

Код:
#include <iostream>

using namespace std;

float recursion(float chislo)
{
    if (chislo == 0) return 0; // Если ряд завершен, то возвращаем 0

    float a = chislo / (chislo + 1);

    cout<<a<<endl;
    return a + recursion(chislo - 1);
}

int main()
{
    cout <<   recursion(5.0);
    return 0;
}
from dark to light)

Последний раз редактировалось Алексей_2012; 24.10.2015 в 18:56.
Алексей_2012 вне форума Ответить с цитированием
Старый 24.10.2015, 18:58   #57
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Притом так, чтоб в параметрах функции было число типа int?
Код:
float recursion(int chislo)
{
    if (chislo == 0) return 0; // Если ряд завершен, то возвращаем 0

    float a = 1.0*chislo / (chislo + 1);

    cout<<a<<endl;
    return a + recursion(chislo - 1);
}
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2015, 19:43   #58
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Спасибо, а вот почему при i=1 выдается 1, а не 3?

Код:
#include <iostream>
#include <math.h> // для вызова pow

using namespace std;

float recursion(int chislo,int i)
{

if (i==0) return 0;
float a = pow((1.0*chislo),i)/(pow(1.0*3,i)*(i+1));
return a+recursion(chislo-1,i-1);
}

int main()
{
    cout << "Itog: "<< (1+recursion(3,3));
    return 0;
}
Изображения
Тип файла: jpg 2.jpg (4.9 Кб, 30 просмотров)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 24.10.2015, 19:44   #59
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Или float a = chislo / (chislo + 1.0);.
По последнему коду - chislo это x? Тогда почему оно уменьшается?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 24.10.2015 в 19:48.
BDA вне форума Ответить с цитированием
Старый 24.10.2015, 19:53   #60
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Точно, опять моя невнимательность, тороплюсь сделать 10 рекурсий до после завтра.

А как закодить в функции то, что при i=1 нужно вычислить из 1 то/, что получилось на предыдущий итерации.

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

using namespace std;


float recursion(int x,int i)
{

    if(i==0) return 0;


    float a = pow(x,i) / pow(5,i)*sqrt(i+1);

   if (i % 2)
        return a + recursion(x,i - 1);
    else
        return -a + recursion(x,i - 1);
}

int main()
{
    cout<<recursion(5,5);
    return 0;
}
Или может быть из единицы вычесть функцию в main?

Все равно не получилось сделать так, чтоб в числителе было 5..3...1, а в знаменателе то же самая i, но с другими значениями

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

using namespace std;


float recursion(int x,int i)
{

    if(i==0) return 0;

    
    float chislitel=pow(1.0*x,i-1);
    float znaminatel =pow(1.0*5,i)*sqrt(i+1); 
    
        
    float a = chislitel  / znaminatel ;

   cout<<a<<endl;

   if (i % 2)
        return a + recursion(x,i - 1);
    else
        return -a + recursion(x,i - 1);
}

int main()
{
    cout<<"ITOG: "<<recursion(5,5);
    return 0;
}
Изображения
Тип файла: jpg 1.jpg (6.4 Кб, 56 просмотров)
from dark to light)

Последний раз редактировалось Stilet; 25.10.2015 в 10:08.
Алексей_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