Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

рекурсивное вычесление последовательности на С++

2.2K
12 ноября 2006 года
MagicPRO
100 / / 02.10.2006
Для введённого целого n вычислить a0*2^0+ a1*2^1+ a3*2^3+…+ an*2^n, где а0, а1, а3,…, аn – принимают значения –1, 0,1 поочерёдно, т.е. –1,0,1,-1,0,1, и т.д.
242
12 ноября 2006 года
Оlga
2.2K / / 04.02.2006
main() надеюсь подправить не проблема =).
а насчет степеней ты помоему ошибся, или я не поняла. степень возрастает от 0 до n на единицу?
Код:
#include <stdio.h>
#include <math.h>
int func(int a, int n)
{
 static int p = -1;
 if( p == n) return 0;
 if(a > 1) a = -1;
 p++;
 return a*((int)pow(2, p)) + func(++a, n);
}
int main(void)
{
 printf("%d\n\n", func(-1, 5));
 return 0;
}
5.4K
12 ноября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=MagicPRO]Для введённого целого n вычислить a0*2^0+ a1*2^1+ a3*2^3+…+ an*2^n, где а0, а1, а3,…, аn – принимают значения –1, 0,1 поочерёдно, т.е. –1,0,1,-1,0,1, и т.д.[/QUOTE]
#include <math.h>
// внутри функции:
double i = 0.0;
double result;
double a = -1.0;
for(; i <= n; i++) {
result += pow(a * 2, i);
++a = (a > 1.0)? -1.0: a;
}
3.0K
12 ноября 2006 года
Мerlin
267 / / 25.07.2006
Код:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>

int calcSum(int koef, int pow2, int N)
{
  if(N==0)
    return koef*pow2;
  else
    return koef*pow2 + calcSum((koef==1) ? -1 : koef+1, pow2<<1, --N);
}

void main ()
{
  int n;
  cout << "Vvedite N : ";
  cin >> n;
  int sum = calcSum(-1, 1, n);
  cout << sum << endl;
  getch();
}
2.2K
12 ноября 2006 года
MagicPRO
100 / / 02.10.2006
Подправить не проблема, я не мог разобраться с рекурсией в числовом ряде! спасибо
3.0K
12 ноября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=OlgaKr]main() надеюсь подправить не проблема =).
а насчет степеней ты помоему ошибся, или я не поняла. степень возрастает от 0 до n на единицу?
Код:
#include <stdio.h>
#include <math.h>
int func(int a, int n)
{
 static int p = -1;
 if( p == n) return 0;
 if(a > 1) a = -1;
 p++;
 return a*((int)pow(2, p)) + func(++a, n);
}
int main(void)
{
 printf("%d\n\n", func(-1, 5));
 return 0;
}
[/QUOTE]Нужно бы изменить func, так как теперь содержит один баг
Код:
int func(int a, int n)
{
 static int p = -1;
 if( p == n)
 {
    p = -1;
    return 0;
 }
 if(a > 1) a = -1;
 p++;
 return a*((int)pow(2, p)) + func(++a, n);
}
242
12 ноября 2006 года
Оlga
2.2K / / 04.02.2006
ну ты прав конечно, если функцию использовать несколько раз для вычесления разных последовательностей ...
спасибо за поправку, но твой вариант мне больше понравился.
3.0K
12 ноября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=OlgaKr]ну ты прав конечно, если функцию использовать несколько раз для вычесления разных последовательностей ...
спасибо за поправку, но твой вариант мне больше понравился.[/QUOTE]
В моем варианте тоже нужно бы подправить ф-ю "func"
 
Код:
int calcSum(int koef, int pow2, int N)
{
  if(N == 0)
    return koef*pow2;
  else
    return koef*pow2 + calcSum((koef==1) ? -1 : koef+1, pow2<<1, --N);
}
2.2K
15 ноября 2006 года
MagicPRO
100 / / 02.10.2006
короче народ, че то мы не то тут написали=)) звеняюсь может я не так выложил или вы не так поняли, хотя 2 вариант менее вероятен. тут "a" должно меняться -1,0,1,-1,0,1,-1,0,1 ну и т.д.
Код:
#include <stdio.h>
#include <math.h>
int func(int a, int n)
{
 static int p = -1;
 if( p == n) return 0;
 if(a > 1) a = -1;
 p++;
 return a*((int)pow(2, p)) + func(++a, n);
}
int main(void)
{
 printf("%d\n\n", func(-1, 5));//а что это за параметры???
 return 0;
}
я пользовался этим вариантом так как он мне более легче в понимании, но при выводе в "main" шото он не хочет работать, ввожу n , а сумму не хочет считать как оно будет выглядеть cout<<""
242
15 ноября 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
короче народ, че то мы не то тут написали=)) звеняюсь может я не так выложил или вы не так поняли, хотя 2 вариант менее вероятен. тут "a" должно меняться -1,0,1,-1,0,1,-1,0,1 ну и т.д.


що то я тебя не понимай :), а мы что написали? и в первом и во втором варианте значение a меняется именно таким образом.

Код:
#include <math.h>
#include <iostream.h>
#include <conio.h>
 
 
int func(int a, int n, int p)
{
    if(a > 1) a = -1;
    if( p == n) return a*((int)pow(2, p));
    return a*((int)pow(2, p)) + func(++a, n, ++p);
}
void main ()
{
  int n;
  cout << "Vvedite N : ";
  cin >> n;
  int sum = func(-1, n, 0);
  cout << sum << endl;
  getch();
}
2.2K
15 ноября 2006 года
MagicPRO
100 / / 02.10.2006
хм....значит я не правильно проанализировал.
а если не сложно че это за параметры?(-1, n, 0);
242
15 ноября 2006 года
Оlga
2.2K / / 04.02.2006
изначально(когда мы первый раз запускаем функцию)
a == -1
n - введеное пользователем число (a0*2^0+ ... + an*2^[COLOR=blue]n[/COLOR][COLOR=black])[/COLOR]
0 == p == степень двойки (от 0 до N включительно)
2.2K
15 ноября 2006 года
MagicPRO
100 / / 02.10.2006
Спасибо огромное
5.4K
16 ноября 2006 года
Svyatozar
221 / / 11.09.2006
Прошу прощения, в моем коде была ошибка. Вот проверенный вариант моего кода:

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

int main(int stdc, char **argv) {
    int n = 10;
    if(stdc > 1) {
        sscanf(argv[1], "%d", &n);
    }
    printf("input parameter n = %d\n", n);
    printf("calculating a0*2^0 + a1*2^1 + a3*2^3 + ... + an*2^n,"
            "where an = -1,0,1,-1,0,1...\n");

    double i = 0.0;
    double result;
    double a = -1.0;
    for(; i < n; i++) { // в этой строке была ошибка: было i <= n
        result += pow(a * 2, i);
        printf("a%d = %d; result = %f\n", int(i), int(a), result);
        ++a = (a > 1.0)? -1.0: a;
    }
    printf("result = %f\n", result);
    return 0;
}
Выдает следующее:

Код:
./seq 16
input parameter n = 16
calculating a0*2^0 + a1*2^1 + a3*2^3 + ... + an*2^n,where an = -1,0,1,-1,0,1...
a0 = -1; result = 1.000000
a1 = 0; result = 1.000000
a2 = 1; result = 5.000000
a3 = -1; result = -3.000000
a4 = 0; result = -3.000000
a5 = 1; result = 29.000000
a6 = -1; result = 93.000000
a7 = 0; result = 93.000000
a8 = 1; result = 349.000000
a9 = -1; result = -163.000000
a10 = 0; result = -163.000000
a11 = 1; result = 1885.000000
a12 = -1; result = 5981.000000
a13 = 0; result = 5981.000000
a14 = 1; result = 22365.000000
a15 = -1; result = -10403.000000
result = -10403.000000
3.0K
16 ноября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=Svyatozar]<skipped>
calculating a0*2^0 + a1*2^1 + a3*2^3 + ... + an*2^n,where an = -1,0,1,-1,0,1...
a0 = -1; result = 1.000000
[/QUOTE]imho первый result неправильный, и может опечатка, но result не инициализируется.
И ты вычисляешь (Ai*2)^i, вместо Ai*(2^i), но
(-1*2)^6!=-1*(2^6)
5.4K
16 ноября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=Мerlin]imho первый result неправильный, и может опечатка, но result не инициализируется.
И ты вычисляешь (Ai*2)^i, вместо Ai*(2^i), но
(-1*2)^6!=-1*(2^6)[/QUOTE]Да, правда что-то я неуглядел... тогда надо result += a * pow(2, i);
Исправил:
Код:
#include <stdio.h>
#include <math.h>

int main(int stdc, char **argv) {
    int n = 10;
    if(stdc > 1) {
        sscanf(argv[1], "%d", &n);
    }
    printf("input parameter n = %d\n", n);
    printf("calculating a0*2^0 + a1*2^1 + a3*2^3 + ... + an*2^n,"
            "where an = -1,0,1,-1,0,1...\n");

    double i = 0.0;
    double result;
    double a = -1.0;
    for(; i <= n; i++) {
        result += a * pow(2, i);
        printf("a%d = %d; result = %f\n", int(i), int(a), result);
        ++a = (a > 1.0)? -1.0: a;
    }
    printf("result = %f\n", result);
    return 0;
}

На выходе теперь:
Код:
./seq 8
input parameter n = 8
calculating a0*2^0 + a1*2^1 + a3*2^3 + ... + an*2^n,where an = -1,0,1,-1,0,1...
a0 = -1; result = -1.000000
a1 = 0; result = -1.000000
a2 = 1; result = 3.000000
a3 = -1; result = -5.000000
a4 = 0; result = -5.000000
a5 = 1; result = 27.000000
a6 = -1; result = -37.000000
a7 = 0; result = -37.000000
a8 = 1; result = 219.000000
result = 219.000000
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог