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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
#1

Программирование рекурсий - C++

02.03.2012, 18:12. Просмотров 1402. Ответов 27
Метки нет (Все метки)

Функция Аккермана. Даны неотрицательные целые числа n, m. Вычислить A(n,m), где (см рисунок)


Использовать программу, включающую рекурсивную функцию.
Миниатюры
Программирование рекурсий  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.03.2012, 18:24     Программирование рекурсий #2
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
32
33
34
//
//  main.cpp
//  test
//
//  Created by Ilya Lavrenov on 3/2/12.
//  Copyright (c) 2012 [email]sandye64@gmail.com[/email]. All rights reserved.
//
 
#include <iostream>
 
int A(unsigned int n, unsigned int m)
{
    unsigned int return_value;
    
    if (!n)
        return_value = m + 1;
    else
        if (!m && n)
            return_value = A(n - 1, 1);
        else
            return_value = A(n - 1, A(n, m - 1));
    
    return return_value;
}
 
int main(int argc, const char * argv[])
{
 
    unsigned int m, n;
    std::cout << "Введите значения m, n" << std::endl;
    std::cin >> m >> n;
    std::cout << "Результат: " << A(n, m) << std::endl;
    return 0;
}
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
02.03.2012, 22:24  [ТС]     Программирование рекурсий #3
sandye51, программа не вычисляет m,n/
можно ли программу сделать чез int main()
p.s. чу чуть по проще)
-=ЮрА=-
Заблокирован
Автор FAQ
03.03.2012, 05:33     Программирование рекурсий #4
aidoqa, я вижу это задание вот так
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
#include <iostream>
using namespace std;
 
int A(int n, int m)
{
    int ret = m + 1;
    if(n != 0)
    if(m == 0)
        ret = A(n - 1, 1);
    else
        ret = A(n - 1,A(n, m - 1));
    cout<<"m = "<<m<<" n = "<<n<<" A = "<<ret<<endl;
    return ret;
}
 
 
int main()
{
    int m, n;
    cout<<"Enter m : ";cin>>m;
    cout<<"Enter n : ";cin>>n;
    A(m,n);
    system("pause");
    return 0;
}
Проверял на вводе 3 4 - программа сидит в рекурсии секунд 10
Миниатюры
Программирование рекурсий  
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.03.2012, 06:39     Программирование рекурсий #5
А я вот как то так
C++
1
2
3
4
5
6
7
8
9
int A( int n, int m ) {
    if ( n == 0 )
    return m + 1;
 
    if ( m == 0 )
    return A( n - 1, 1 );
 
    return A( n - 1, A( n, m - 1));
}
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 13:06  [ТС]     Программирование рекурсий #6
-=ЮрА=-, почему то при проверке ваша команда не останавливается(проверял на DEV c++)
можно ли ее как нибудь остановить?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 15:53     Программирование рекурсий #7
При каких значениях?
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 16:03  [ТС]     Программирование рекурсий #8
при любых, хоть что вожу он сам перебирает несколько значений?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 17:04     Программирование рекурсий #9
Каких любых?) Проверил, все нормально. Функция растет очень быстро, при n == 4 и m == 1 получается 65533. Дальше вообще огромные числа.
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 17:13  [ТС]     Программирование рекурсий #10
как можно сделать поменьше?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 17:15     Программирование рекурсий #11
Что поменьше?) Выходное значение? Вводить n < 4
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 17:23  [ТС]     Программирование рекурсий #12
Toshkarik, покажи скрин этой программы
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
#include <iostream>
using namespace std;
 
int A(int n, int m)
{
        int ret = m + 1;
        if(n != 0)
        if(m == 0)
                ret = A(n - 1, 1);
        else
                ret = A(n - 1,A(n, m - 1));
        cout<<"m = "<<m<<" n = "<<n<<" A = "<<ret<<endl;
        return ret;
}
 
 
int main()
{
        int m, n;
        cout<<"Enter m : ";cin>>m;
        cout<<"Enter n : ";cin>>n;
        A(m,n);
        system("pause");
        return 0;
}
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 17:50     Программирование рекурсий #13
Просто поменяй вот так
C++
1
2
3
4
int m, n;
cout<<"Enter n : ";cin>>n;
cout<<"Enter m : ";cin>>m;
A(n,m);
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 18:14  [ТС]     Программирование рекурсий #14
при вводе цифр (0,1) (1,0) (1,1) вроде все нормально если например (2,2) то что то не(или так должно и быть)
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 19:03     Программирование рекурсий #15
Проверил, все правильно, при 2, 2 результат 7. Вот если что таблица некоторых значений Функция Аккермана
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 19:08  [ТС]     Программирование рекурсий #16
почему у меня тогда сразу вот так идет?см(рисунок)
Миниатюры
Программирование рекурсий  
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 19:14     Программирование рекурсий #17
Все правильно, если не нужны промежуточные значения то удали в функции строку cout...
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 19:20  [ТС]     Программирование рекурсий #18
Toshkarik,
какую именно если удалить
C++
1
 cout<<"m = "<<m<<" n = "<<n<<" A = "<<ret<<endl;
то см(рисунок321), другие если удалять то ошибка)
Миниатюры
Программирование рекурсий  
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.03.2012, 19:27     Программирование рекурсий #19
Все верно, если не нужны промежуточные значения удали строку
C++
1
cout<<"m = "<<m<<" n = "<<n<<" A = "<<ret<<endl;
в функции, а в main измени
C++
1
A(n,m);
на
C++
1
cout << A(n,m) << endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2012, 19:31     Программирование рекурсий
Еще ссылки по теме:

Программирование рекурсий. Преобразование числа в двоичное C++
C++ Программирование рекурсий. Преобразование числа в двоичное
C++ Программирование рекурсий.
Программирование на С++ C++
Программирование в С++ C++

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

Или воспользуйтесь поиском по форуму:
aidoqa
586 / 99 / 2
Регистрация: 08.02.2011
Сообщений: 839
04.03.2012, 19:31  [ТС]     Программирование рекурсий #20
Toshkarik, можешь готовый код закинуть, у меня что не получается(
Yandex
Объявления
04.03.2012, 19:31     Программирование рекурсий
Ответ Создать тему
Опции темы

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