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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
#1

Разработать рекурсивную функцию - C++

15.12.2010, 17:53. Просмотров 2138. Ответов 16
Метки нет (Все метки)

Разработать рекурсивную функцию нахождения значения функции Аккермана, которая определяется для всех неотрицательных целых аргументов m и n следующим образом:
А(0,n)=n+1;
A(m,0)=A(m-1,1), если (m>0);
A(m,n)=A(m-1,A(m,n-1)), если (m, n >0).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2010, 17:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Разработать рекурсивную функцию (C++):

Разработать рекурсивную функцию - C++
Разработать рек. функцию , возвращающая значение: для вычисления суммы цифр в строке. С помощью этой функ. определить в какой из двух строк...

Разработать рекурсивную функцию, возвращающую значение: - C++
для вычисления значения функции Аккермана для неотрицательных чисел n и m. Функция Аккермана определяется следующим образом:

разработать не рекурсивную функцию,возвращающее значение: - C++
для вычисления количества цифр в строке;с помощью данной функции определить,в каком из двух предложений цифр больше

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

Разработать рекурсивную функцию, возвращающую значение - C++
Разработать рекурсивную функцию, возвращающую значение: для вычисления значения функции:

Разработать рекурсивную функцию, для вычисления числа сочетаний - C++

16
valeriikozlov
Эксперт С++
4682 / 2508 / 322
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 20:04 #16
juli.ya92, Не за что.
0
Mr.X
Эксперт С++
3060 / 1705 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.12.2010, 00:22 #17
Цитата Сообщение от valeriikozlov Посмотреть сообщение
В данном случае результат не должен превышать 2147483647
Ну, тут гораздо быстрее переполнения возвращаемого значения происходит переполнение стека.
Например, при вызове A(4, 1) значение n должно увеличиться до 65533, а переполнение стека происходит при значениях:

m = 1; n = 1885; вызовов функции = 2471713
m = 0; n = 1886; вызовов функции = 2475484
m = 1; n = 1887; вызовов функции = 2475485
m = 0; n = 1888; вызовов функции = 2479260
m = 1; n = 1889; вызовов функции = 2479261
m = 0; n = 1890; вызовов функции = 2483040
m = 1; n = 1891; вызовов функции = 2483041
Для продолжения нажмите любую клавишу . . .

Т.е. для того чтобы n увеличилось на 1 иногда должно произойти около 4 тысяч рекурсивных вызовов.
В этом можно убедиться с помощью, например, этой программы:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//////////////////////////////////////////////////////////////////////////////////////
#include <exception>
#include <iostream>
#include <limits>
#include <stdexcept>
//////////////////////////////////////////////////////////////////////////////////////
typedef long long  T_num;
//////////////////////////////////////////////////////////////////////////////////////
const T_num  T_num_VAL_MAX  = std::numeric_limits<T_num>::max();
T_num        call_counter   = 0;
T_num        n_cur          = 0;
//////////////////////////////////////////////////////////////////////////////////////
T_num  ackermann(T_num  m, T_num  n)
{
    ++call_counter;
    if(n_cur < n)
    {
        n_cur = n;
        std::cout << "m = "
                  << m
                  << "; n = "
                  << n
                  << "; вызовов функции = "
                  << call_counter
                  << std::endl;
    }
              
    if(m < 0)
    {
        throw std::domain_error("Должно быть m >= 0.");
    }
 
    if(n < 0)
    {
        throw std::domain_error("Должно быть n >= 0.");
    }
 
    if(m == 0)
    {
        if(n == T_num_VAL_MAX)
        {
            throw  std::range_error("Возвращаемое значение превышает допустимый предел.");    
        }
        return  n + 1;
    }
 
    if(n == 0)
    {
        return  ackermann(m - 1, 1);
    }
 
    return  ackermann(m - 1, ackermann(m, n - 1));
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        call_counter  = 0;
        n_cur         = 0;
        std::cout << std::endl
                  << std::endl
                  << "m = ";
        T_num  m = 0;
        std::cin >> m;
 
        std::cout << "n = ";
        T_num  n = 0;
        std::cin >> n;
 
        try
        {
            std::cout << "ackermann("
                      << m
                      << ", "
                      << n
                      << ") = "
                      << ackermann(m, n)
                      << std::endl;          
        }
        catch(const std::exception& e)
        {
            std::cout << e.what()
                      << std::endl;
            break;
        }        
    }
}
0
16.12.2010, 00:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2010, 00:22
Привет! Вот еще темы с ответами:

Разработать рекурсивную функцию для вывода на экран стихотворения - C++
Разработать рекурсивную функцию, не возвращающую значений:Разработать рекурсивную функцию для вывода на экран стихотворения: 10 лунатиков...

Разработать рекурсивную функцию нахождения минимального элемента данной последовательности а1, а2, … - C++
Разработать рекурсивную функцию нахождения минимального элемента данной последовательности а1, а2, …, аn.

дана программа на рекурсивную функцию надо разработать как рисунке - C++
выкладываю рисунок и программу с заданием.надо также нарисовать чертеж ..:)думаю вы меня поняли))) разработать рекурсивную функцию...

Разработать рекурсивную функцию, определяющую, является ли заданная строка палиндромом - C++
Разработать рекурсивную функцию, возвращающую значение: Определяющую, является ли заданная строка палиндромом.


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

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

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