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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Юлек
4 / 3 / 0
Регистрация: 26.10.2009
Сообщений: 43
#1

Найти 1+2+3+...+n рекурсивно и итеративно - C++

30.08.2010, 22:29. Просмотров 3151. Ответов 54
Метки нет (Все метки)

Уважаемые программисты!!! помогите разобраться, дали задачу. Найти 1+2+3+...+n.
Первый способ, решить рекурсивно, а второй не рекурсивно. Чем текст программ будет различаться???
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 22:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти 1+2+3+...+n рекурсивно и итеративно (C++):

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

Вычисление цепной дроби (рекурсивно и итеративно) - C++
Как это вообще сделать ??? Нужно с помощь. рекурсии и без неё С++.

Вычислить произведение рекурсивно/итеративно, оценить время выполнения - C++
Нужно разработать программу с использованием рекурсивной функции и без использования рекурсивной функции. Оценит время выполнения. x=...

Найти рекурсивно сумму ряда - C++
e^(-x^2) = сумма, где k от 0 до бесконечности (-1)^k * (x^2*k)/k! x от 1 до 15 Пользуйтесь редактором формул внизу страницы ...

Найти рекурсивно значение функции Аккермана A(m, n) - C++
Я новичек так что сильно не бейте :) Нужно рекурсивно найти функцию Аккермана. double Akerrman(int m,int n) { if (m = 0) return...

Найти минимальный элемент массива рекурсивно - C++
Всем привет!!! Нужно найти минимальный элемент массива при помощи рекурсии. Просидел вчера весь день и никак не могу воткнуть как...

54
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
31.08.2010, 00:09 #31
для разнообразия
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>
 
class Sum {
    unsigned int nResult;
public:
    Sum() : nResult(0) {}
    Sum(unsigned int start){
        for ( nResult = 0; start; nResult += start-- )
            ;
    }
    friend std::ostream & operator << (std::ostream & ost, const Sum & sum){
        ost << sum.nResult;
        return ost;
    }
};
 
int main(){
    int val;
    
    std::cout << "Enter some positive numbers (negative - exit)" << std::endl;
    
    while ( true ){
        std::cout << "> ";
        std::cin >> val;
        if ( val < 0 )
            break;
        std::cout << "  " << Sum(val) << std::endl;
    }
    
    return 0;
}
2
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
31.08.2010, 00:16 #32
easybudda, Неслабо) Хорошее разнообразие
1
NightmareZ
1360 / 569 / 37
Регистрация: 31.03.2009
Сообщений: 1,943
31.08.2010, 00:18 #33
Цитата Сообщение от easybudda Посмотреть сообщение
для разнообразия
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>
 
class Sum {
    unsigned int nResult;
public:
    Sum() : nResult(0) {}
    Sum(unsigned int start){
        for ( nResult = 0; start; nResult += start-- )
            ;
    }
    friend std::ostream & operator << (std::ostream & ost, const Sum & sum){
        ost << sum.nResult;
        return ost;
    }
};
 
int main(){
    int val;
    
    std::cout << "Enter some positive numbers (negative - exit)" << std::endl;
    
    while ( true ){
        std::cout << "> ";
        std::cin >> val;
        if ( val < 0 )
            break;
        std::cout << "  " << Sum(val) << std::endl;
    }
    
    return 0;
}

Спасибо, что вынесли мне мозг перед сном. Я обязательно положу этот пример в коллекцию "как делать не нужно".

Интересно, какую сущность описывает этот класс?
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
31.08.2010, 00:23 #34
NightmareZ, Примерно такую же какой и этот:

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 <string>
 
class Hello
{
   std::string f;
public:
    Hello():f("Hello, world!"){}
    ~Hello(){}
    friend std::ostream& operator <<(std::ostream& os, const Hello &Ob);
};
 
std::ostream& operator <<(std::ostream& os, const Hello& Ob)
{
   os<<Ob.f<<'\n';
   return os;
}
 
int main()
{
    Hello Str;
    std::cout<<Str;
    return 0;
}
0
Юлек
4 / 3 / 0
Регистрация: 26.10.2009
Сообщений: 43
31.08.2010, 00:23  [ТС] #35
да... вот это программа!!!!!! ужас!!!! такая замудренная!!!!
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
31.08.2010, 00:29 #36
Юлек, Ну ничего особо замудренного там нет. Просто через ООП) Класс, да перегрузка оператора вывода в поток.
0
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
31.08.2010, 00:33 #37
очень понравился этот момент, не знал что так можно, спасиб!
C++
1
for ( nResult = 0; start; nResult += start-- );
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
31.08.2010, 00:36 #38
Цитата Сообщение от NightmareZ Посмотреть сообщение
Спасибо, что вынесли мне мозг перед сном.
Обращайтесь.
Цитата Сообщение от NightmareZ Посмотреть сообщение
Я обязательно положу этот пример в коллекцию "как делать не нужно".
Не будьте голословным, объясните, почему именно так делать не нужно.
Цитата Сообщение от NightmareZ Посмотреть сообщение
Интересно, какую сущность описывает этот класс?
Никакой сущности он не описывает, просто решает поставленную задачу. Про функторы почитайте...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
31.08.2010, 00:49 #39
easybudda, Почему не

C++
1
2
3
4
5
void operator()(unsigned int start)
{
   for ( nResult = 0; start; nResult += start-- )
      ;
}
Собственно понял почему здесь он не будет нормально работать.
0
NightmareZ
1360 / 569 / 37
Регистрация: 31.03.2009
Сообщений: 1,943
31.08.2010, 00:57 #40
Цитата Сообщение от easybudda Посмотреть сообщение
Не будьте голословным, объясните, почему именно так делать не нужно.
Ну, во-первых, потому что бессмысленно громоздить лишние конструкции ради того, что решается проще, быстрее и удобнее простой функцией.

А, во-вторых,
Цитата Сообщение от easybudda Посмотреть сообщение
Никакой сущности он не описывает, просто решает поставленную задачу. Про функторы почитайте...
Класс таки должен быть схемой, моделью некоторых сущностей. А, если он таковым не является, это наводит на подозрение, что есть просто для того, чтобы был.

Да знаю я что такое функторы. Но тут функции выше крыши хватает.

К тому же, что это за функтор такой, который после инстанцирования всегда возвращает одно и то же значение? На эту роль константа подходит.

Да и для функторов в C++ принято перегружать оператор ()... но это уже придирка

Вобщем, я считаю, что тут лютый оверхед.
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
31.08.2010, 01:04 #41
Lavroff, а зачем? в конструкторе вся основная работа делается. а добавить в класс
C++
1
unsigned int operator () () const { return nResult; }
получится самый, что нинаесть функтор, пригодный для более широкого применения, чем просто вывод суммы на экран...

кстати, если в примере из 6 поста строчку
C++
1
const int sum = Sum<5>::value;
поменять на
C++
1
const int sum = Sum<0>::value;
оно и не скомпилируется, про отрицательные числа и говорить не приходится, да и как это чудо использовать, если значение должно не константой задаваться? При моём подходе во-первых не сложно проверку входных данных устроить, во-вторых использовать просто...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
31.08.2010, 01:11 #42
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Извините без обид, но люто-бешено напомнило.

Как пишут Hello, world

А на тему класса и функторов, все же тут реальный перебор для такой программы. Действительно красиво, да. Но ведь в таком случае и писать Hello, world через класс тоже нормально, если учитывать что потом программа может делать нечто большее.
Кстати, а в конструкторе нормально выполнять все нужные операции или все же лучше в конструкторе проводить только инициализацию?
3
NightmareZ
1360 / 569 / 37
Регистрация: 31.03.2009
Сообщений: 1,943
31.08.2010, 01:21 #43
Цитата Сообщение от easybudda Посмотреть сообщение
получится самый, что нинаесть функтор, пригодный для более широкого применения, чем просто вывод суммы на экран...
Например?

Цитата Сообщение от easybudda Посмотреть сообщение
кстати, если в примере из 6 поста строчку
C++
1
const int sum = Sum<5>::value;
поменять на
C++
1
const int sum = Sum<0>::value;
оно и не скомпилируется, про отрицательные числа и говорить не приходится
Ну логично же. Оно не скомпилируется и выдаст ошибку компиляции. Очень логично. Программа выдаёт ошибки во время работы, метапрограмма - во время компиляции.

Цитата Сообщение от easybudda Посмотреть сообщение
да и как это чудо использовать, если значение должно не константой задаваться? При моём подходе во-первых не сложно проверку входных данных устроить, во-вторых использовать просто...
А здесь всё ещё более логично. "Чудо" это вычисляется во время компиляции. Очевидно, что в готовой программе вместо "чуда" мы имеем константу. Отсюда несложно сделать вывод, что вычислить можно сумму только из тех значений, которые на момент компиляции известны. Я же нигде не писал, что оно будет работать в рантайме, ведь правда? И в ТЗ ничего об этом сказано небыло.

А по поводу того, что ты подставил ноль вместо пяти: нужна сумма первых нуля элементов? Она равна нулю!

Цитата Сообщение от easybudda Посмотреть сообщение
При моём подходе во-первых не сложно проверку входных данных устроить, во-вторых использовать просто...
Твой подход не нужен, потому что вместо него гораздо удобнее фунции, описанные другими товарищами тут в теме до тебя.

Добавлено через 8 минут
Цитата Сообщение от Lavroff Посмотреть сообщение
Кстати, а в конструкторе нормально выполнять все нужные операции или все же лучше в конструкторе проводить только инициализацию?
Я думаю, правильно так:
  1. Нечто внешнее по отношению к данному коду инициализирует функтор (если нужно какими-то данными).
  2. Данный код получает функтор, вызывая его передаёт ему какие-то свои параметры и функтор на основе их и того, что ему было заложено в предыдущем шаге, делает вычисления / что-то полезное.
1
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
31.08.2010, 01:37 #44
Цитата Сообщение от NightmareZ Посмотреть сообщение
Я же нигде не писал, что оно будет работать в рантайме, ведь правда?
Ну а смысл тогда такой лес городить? Можно гораздо проще и со временем выполнения проблем не будет.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
#define SUM(a) ({ int d = a; int s = 0; while ( d ) s += d--; (s); })
 
int main(void){
    printf("SUM(5) = %d\n", SUM(5));
    int i = 5;
    printf("SUM(%d) = %d\n", i, SUM(i));
    
    return 0;
}
Цитата Сообщение от NightmareZ Посмотреть сообщение
Твой подход не нужен
Повторяйте себе это почаще.

Не по теме:

И кстати, ничего, что я с Вами на Вы? Ну это так, элементарная вежливость...

0
ISergey
Maniac
Эксперт С++
1390 / 901 / 55
Регистрация: 02.01.2009
Сообщений: 2,693
Записей в блоге: 1
31.08.2010, 01:43 #45
Цитата Сообщение от easybudda Посмотреть сообщение
поменять на
C++
1
const int sum = Sum<0>::value;
оно и не скомпилируется
Нашли проблему.. лечится быстро..

C++
1
2
3
4
template<>
struct Sum<0>{
        enum { value = 0 };
};
Как на меня то метапрограмы доволи интересная штука..
2
31.08.2010, 01:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2010, 01:43
Привет! Вот еще темы с ответами:

Рекурсивно найти число входящих элементов Е в дерево Т - C++
Почему-то не работает, помогите! :C struct gruz_p // Описание записи о грузополучателе { char nomer, fio, dr, pol, ...

Рекурсивно найти сумму нечетных элементов до заданного n - C++
Добрый вечер! Необходимо рекурсивно найти сумму нечетных элементов до заданного n, даже не знаю с чего начать!...

Рекурсивно найти n-ую производную для заданого x. Результат похож на шестнадцатеричный код - C++
Задание:рекурсивно найти n-ую производную f(x)={e}^{(a{x}^{2}+bx+c)} для заданого x,построив для {f}^{(n)}(x) рекурентное соотношение. ...

Рекурсивно обчислити добуток n ≥ 2 співмножників (n парне): у = (2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7).Рекурсивно обчислити добуток n ≥ 2 співмножників - C++
Рекурсивно обчислити добуток n ≥ 2 співмножників (n парне): у = (2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7)...


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

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

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