Форум программистов, компьютерный форум CyberForum.ru

Арифметическая прогрессия - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 17:27     Арифметическая прогрессия #1
Вообщем, поиск по форму ничего не дал, а с++ я помню плохо.
Есть задачка, дана последовательность, скажем из 5 чисел, в виде массив, нужно определить являеться ли она арифметической прогрессией. Задачка простая. НО надо сделать с помощью рекурсии. Как вычислить сумму n членов прогрессия я понимаю, и то просто, даже с помощью рекурсии. Но как именно в рекурсии определить являеться ли она таковой. Массив не глобальный, онпередел с помощью указателей.
У кого то есть мысли как это сделать?

Добавлено через 2 часа 20 минут
Не у кого нет никаких мыслей? в самой рекурсивной функции нет возможности работать с массивом. Не или я не знаю как его туда передать.
Код не прошу, прошу саму идею.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2012, 17:27     Арифметическая прогрессия
Посмотрите здесь:

арифметическая операция C++
Арифметическая прогрессия C++
C++ Арифметическая прогрессия
C++ Арифметическая прогрессия
C++ Арифметическая прогрессия в массиве
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
13.10.2012, 17:50     Арифметическая прогрессия #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
bool _IsAriphmProgress(const T* a, unsigned n, const T& diff) {
    bool b = *a + *(a + 1) == diff;
    if (b && n > 2)
        return _IsAriphmProgress(a + 1, n - 1, diff);
    return b;
}
 
template <typename T>
bool IsAriphmProgress(const T a[ ], unsigned n) {
    return n <= 1? true: _IsAriphmProgress(a, n, a[0] + a[1]);
}
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 18:02  [ТС]     Арифметическая прогрессия #3
Только через шаблоны? Никогда с ними не работал. Небольшое пояснение можно?
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
13.10.2012, 18:53     Арифметическая прогрессия #4
Уберите строки template <typename T> и замените T на нужный тип (например, short или float).
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 19:10  [ТС]     Арифметическая прогрессия #5
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
bool _IsAriphmProgress(const T* a, unsigned n, const T& diff) {
    bool b = *a + *(a + 1) == diff;
    if (b && n > 2)
        return _IsAriphmProgress(a + 1, n - 1, diff);
    return b;
}
 
template <typename T>
bool IsAriphmProgress(const T a[ ], unsigned n) {
    return n <= 1? true: _IsAriphmProgress(a, n, a[0] + a[1]);
}
Ты ну отлично, только, он возвращает, по сути сумму n членов, а мне нужно что бы процедура определила, являеться ли она прогрессией, если да то скажем сказала 1, а если нет то сказала 0. А тут вы просто возвращаете сумму. И не понимаю как их вызыывать.
Говорил же сто с шаблонами не работал.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.10.2012, 19:22     Арифметическая прогрессия #6
Цитата Сообщение от fox_ Посмотреть сообщение
Ты ну отлично, только, он возвращает, по сути сумму n членов
где вы видите сумму, там две функции и обе возвращают bool

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
bool IsAriphmProgress(const double a[ ], unsigned n) 
{
    return n <= 1? true: _IsAriphmProgress(a, n, a[0] + a[1]);
}
 
int main()
{
    double a[5]={1,2,3,4,5};
    bool isAPr = IsAriphmProgress(a, 5);
}
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 19:34  [ТС]     Арифметическая прогрессия #7
Цитата Сообщение от defer Посмотреть сообщение
где вы видите сумму, там две функции и обе возвращают bool

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
bool IsAriphmProgress(const double a[ ], unsigned n) 
{
    return n <= 1? true: _IsAriphmProgress(a, n, a[0] + a[1]);
}
 
int main()
{
    double a[5]={1,2,3,4,5};
    bool isAPr = IsAriphmProgress(a, 5);
}

_IsAriphmProgress в этой процедуре, в ее теле на строчке bool b = *a + *(a + 1) == diff; пришет что * должен быть казателем.
вот так у меня выглдит функция, как я понял
C++
1
2
3
4
5
6
7
8
9
10
11
bool _IsAriphmProgress(const int a, unsigned k, const int& diff) {
    bool b = *a + *(a + 1) == diff;
    if (b && n > 2)
        return _IsAriphmProgress(a + 1, n - 1, diff);
    return b;
}
 
bool IsAriphmProgress(const int a[ ], unsigned k) 
{
    return n <= 1? true: _IsAriphmProgress(a, n, a[0] + a[1]);
}
_IsAriphmProgress(a, n, a[0] + a[1]); а вот тут на "а" ругаеться на const int не совмести c int
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.10.2012, 19:37     Арифметическая прогрессия #8
В функции IsAriphmProgress вызывается функция _IsAriphmProgress
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 19:41  [ТС]     Арифметическая прогрессия #9
Цитата Сообщение от defer Посмотреть сообщение
В функции IsAriphmProgress вызывается функция _IsAriphmProgress
Это я понял, я выше исправил пост с другим вопросом.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.10.2012, 19:43     Арифметическая прогрессия #10
C++
1
2
3
4
5
6
7
8
9
10
11
bool _IsAriphmProgress(const int a[], unsigned n, const int& diff) {
    bool b = *a + *(a + 1) == diff;
    if (b && n > 2)
        return _IsAriphmProgress(a + 1, n - 1, diff);
    return b;
}
 
bool IsAriphmProgress(const int a[ ], unsigned n) 
{
    return n <= 1? true: _IsAriphmProgress(a, n, a[0] + a[1]);
}
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 19:51  [ТС]     Арифметическая прогрессия #11
при любых последовательносятх выдает 0.
вот как оформирл


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool _IsAriphmProgress(const int a[], unsigned k, const int& diff) {
    bool b = *a + *(a + 1) == diff;
    if (b && n > 2)
        return _IsAriphmProgress(a + 1, k - 1, diff);
    return b;
}
 
bool IsAriphmProgress(const int a[ ], unsigned k) 
{
    return k <= 1? true: _IsAriphmProgress(a, k, a[0] + a[1]);
}
 
 
 
int main()
{ 
бла бла
 
bool isAPr = IsAriphmProgress(b, 5);
printf("%d",isAPr);
И всегда ноль получаю.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.10.2012, 19:56     Арифметическая прогрессия #12
C++
1
2
3
4
5
6
7
8
9
10
int main()
{ 
бла бла
 
bool isAPr = IsAriphmProgress(b, 5);
 
if(isApr)
   printf("Это арифметическая прогрессия");
else
   printf("Это не арифметическая прогрессия");
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
13.10.2012, 20:50     Арифметическая прогрессия #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
25
26
#include <iostream>
 
using namespace std;
 
template <typename T, typename T2>
bool _IsAriphmProgress(const T* a, unsigned k, const T2& diff) {
    bool b = *a - *(a + 1) == diff;
    if (b && k > 2)
        return _IsAriphmProgress(a + 1, k - 1, diff);
    return b;
}
 
template <typename T>
bool IsAriphmProgress(const T a[ ], unsigned k) {
    return k <= 1? true: _IsAriphmProgress(a, k, a[0] - a[1]);
}
 
int main() {
    int a[ ] = { 1, 2, 3, 4, 5 };
    cout << IsAriphmProgress(a, 5) << endl;
    double d[ ] = { 3., 5.5, 8., 10.5 };
    cout << IsAriphmProgress(d, 4) << endl;
    short s[ ] = { 1, 2, 4, 8, 16, 32 };
    cout << IsAriphmProgress(s, 6) << endl;
    cin.get();
}
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
13.10.2012, 23:30  [ТС]     Арифметическая прогрессия #14
Спасибо, все заработало.

А в рамках одной рекурсивной процедуры это возможно реализовать? и если да то как?
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
14.10.2012, 09:04     Арифметическая прогрессия #15
Можно, но, во-первых, она будет медленнее работать, а во-вторых, придется передавать третий аргумент, что снизит читабельность кода.
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
14.10.2012, 09:42  [ТС]     Арифметическая прогрессия #16
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Можно, но, во-первых, она будет медленнее работать, а во-вторых, придется передавать третий аргумент, что снизит читабельность кода.
Пример можно? Могу просто прикопаться, и сказать что именно одной процедурой надо это сделать.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
14.10.2012, 10:11     Арифметическая прогрессия #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T, typename T2>
bool IsAriphmProgress2(const T* a, unsigned k, const T2& diff) {
    if (k <= 1)
        return true;
    if (*a - *(a + 1) != diff)
        return false;
    return _IsAriphmProgress(a + 1, k - 1, diff);
}
 
int main() {
    int a[ ] = { 1, 2, 3, 4, 5 };
    cout << IsAriphmProgress2(a, 5, a[0] - a[1]) << endl;
    double d[ ] = { 3., 5.5, 8., 10.5 };
    cout << IsAriphmProgress2(d, 4, d[0] - d[1]) << endl;
    short s[ ] = { 1, 2, 4, 8, 16, 32 };
    cout << IsAriphmProgress2(s, 6, s[0] - s[1]) << endl;
    cin.get();
}
Но я не рекомендую пользоваться этим методом.
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
14.10.2012, 10:24  [ТС]     Арифметическая прогрессия #18
return _IsAriphmProgress(a + 1, k - 1, diff);

так вот же опять. ссылаеться на втору процедуру.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
14.10.2012, 11:48     Арифметическая прогрессия #19
Точно, забыл исправить. Там должно быть IsAriphmProgress2.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 12:17     Арифметическая прогрессия
Еще ссылки по теме:

C++ арифметическая прогрессия
Арифметическая прогрессия C++
Одномерные массивы. Найти есть ли в нем арифметическая прогрессия состоящая из трех элементов C++

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

Или воспользуйтесь поиском по форуму:
fox_
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 23
14.10.2012, 12:17  [ТС]     Арифметическая прогрессия #20
Да, я сам исправил и все работает так как надо. Спасибо большое.
Yandex
Объявления
14.10.2012, 12:17     Арифметическая прогрессия
Ответ Создать тему
Опции темы

Текущее время: 15:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru