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

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

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

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

15.12.2010, 17:53. Просмотров 1896. Ответов 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).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2010, 17:53     Разработать рекурсивную функцию
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 18:51     Разработать рекурсивную функцию #2
C++
1
2
3
4
5
6
7
8
int rec(int m, int n)
{
    if(m==0)
        return n+1;
    if(n==0)
        return rec(m-1, 1);
    return rec(m-1, rec(m, n-1));
}
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 18:56  [ТС]     Разработать рекурсивную функцию #3
А не могли бы вы немного поподробнее написать куда переносить аргументы просто мы никогда такого не проходили и сложно что-то сделать.Заранее большое спасибо

Добавлено через 18 секунд
valeriikozlov, А не могли бы вы немного поподробнее написать куда переносить аргументы
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 19:03     Разработать рекурсивную функцию #4
Цитата Сообщение от juli.ya92 Посмотреть сообщение
А не могли бы вы немного поподробнее написать куда переносить аргументы
Вы наверное это имеете ввиду:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <malloc.h>
int rec(int m, int n)
{
    if(m==0)
        return n+1;
    if(n==0)
        return rec(m-1, 1);
    return rec(m-1, rec(m, n-1));
}
 
 
int main() {
    printf("%d", rec(3,5));
   return 0;
Эта программа вычисляет значения функции Аккермана при m равном 3 и n равном 5
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 19:09  [ТС]     Разработать рекурсивную функцию #5
valeriikozlov, Непонятно откуда ввод и вывод производится
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 19:15     Разработать рекурсивную функцию #6
Цитата Сообщение от juli.ya92 Посмотреть сообщение
Непонятно откуда ввод и вывод производится
Если с вводом значений, то так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <malloc.h>
int rec(int m, int n)
{
        if(m==0)
                return n+1;
        if(n==0)
                return rec(m-1, 1);
        return rec(m-1, rec(m, n-1));
}
 
 
int main() {
    int m, n;
    printf("m= ");
    scanf("%d", &m);
    printf("n= ");
    scanf("%d", &n);
    printf("%d", rec(m,n));
   return 0;
}
Но это уже будет не просто
Разработать рекурсивную функцию
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 19:30  [ТС]     Разработать рекурсивную функцию #7
valeriikozlov, А у вас это программа работает?Просто у меня нет.

Добавлено через 3 минуты
valeriikozlov, Просто если вводишь допустим 5 и 6 не работает почему-то(
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 19:32     Разработать рекурсивную функцию #8
juli.ya92, Я ждал этого вопроса. Вы наверное вводите например: m=4 и n=4. А сами не знаете что количество атомов в наблюдаемой части Вселенной просто не хватает для ответа.
Почитайте:
http://ru.wikipedia.org/wiki/Функция_Аккермана
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 19:45  [ТС]     Разработать рекурсивную функцию #9
valeriikozlov,Так а какие-то ограничения есть?))))Просто когда вводишь нек значения оно просто C++компилятор виснет и всё...
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 19:51     Разработать рекурсивную функцию #10
В данном случае результат не должен превышать 2147483647
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 19:53  [ТС]     Разработать рекурсивную функцию #11
valeriikozlov, Так а я посмотрела там просто бесконечный цикл в отладчике получается...
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 19:57     Разработать рекурсивную функцию #12
juli.ya92, Ну я же Вам ссылку показывал. Введите например:
m=3 n=5
m=3 n=6
m=2 n=5
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 20:00  [ТС]     Разработать рекурсивную функцию #13
valeriikozlov, Так а через отладчик там просто бесконечный цикл оно увеличивает и уменьшает значения...

Добавлено через 1 минуту
valeriikozlov, Программа работает и все эти примеры что вы написали тоже так а как преподавателю объяснить почему программа не работает если он введёт не то значение?)
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 20:01     Разработать рекурсивную функцию #14
Цитата Сообщение от juli.ya92 Посмотреть сообщение
Так а через отладчик там просто бесконечный цикл оно увеличивает и уменьшает значения...
А что Вы хотели?

Добавлено через 59 секунд
Цитата Сообщение от juli.ya92 Посмотреть сообщение
а как преподавателю объяснить почему программа не работает если он введёт не то значение?)
Дайте ему ту же ссылку. Но я уверен, что преподаватель об этом давно знает.
juli.ya92
2 / 2 / 0
Регистрация: 25.09.2010
Сообщений: 82
15.12.2010, 20:02  [ТС]     Разработать рекурсивную функцию #15
valeriikozlov, Спасибо Вам огромное)!!!
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2010, 20:04     Разработать рекурсивную функцию #16
juli.ya92, Не за что.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2010, 00:22     Разработать рекурсивную функцию
Еще ссылки по теме:

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3042 / 1687 / 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;
        }        
    }
}
Yandex
Объявления
16.12.2010, 00:22     Разработать рекурсивную функцию
Ответ Создать тему
Опции темы

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