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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Считывает символьную строку с экрана, выводит в файл (.txt) данную строку, перевернув её(было 123, стало 321) http://www.cyberforum.ru/cpp-beginners/thread211798.html
Наткнулся на задачу, помогите решить: вводиться символьная строка, программа считывает строку и выводит её в файл(текстовой), перевернув ( то есть было - cat, стало - tac) Благодарю.
C++ Минимальное значение Как найти минимальное значение в матрице P? http://www.cyberforum.ru/cpp-beginners/thread211794.html
C++ Системное программирование (найти наибольший элемент по модулю в матрице n*m)
Тип элементов одномерного массива – действительные числа. В данной действительной прямоугольной матрице размером nxm найти наибольший по модулю элемент. Получить матрицу порядка (n-1)xm путем выбрасывания из исходной матрицы строки, в которой расположен элемент с найденным значением. Вот что я уже написал, с конкретно самим заданием испытываю проблемы (см. выше жирным шрифтом): ...
кольцевой список C++
как переделать вот этот односвязный список на кольцевой? //--------------------------------------------------------------------------- #include<stdlib.h> #include<stdio.h> #include<conio.h> //#include<iostream.h> struct buro { char adr; int kom; int et;
C++ Чтение текста из файла и работа с ним!!!! http://www.cyberforum.ru/cpp-beginners/thread211786.html
Добрый день коллеги. У меня задачка сложная для меня есть, помогите с решением пожалуйста... Задача:Даны текстовые файлы F и G.Переписать в файл Q слова из файлов F и G поочередно, одно слово из F, другое из G. После окончания слов в одном из входных файлов, запись прекращается. Вот такие вот пироги!))))
C++ поменять буквы "a" на 1 и 0 Нужно ввести с клавиатуры строку символов, после чего заменить 3 первые буквы "a" на цифру 0, а остальные "a" на 1 и записать результат строки в файл, после чего вывести данные из файла на экран. Помогите пожалуйста или скажите алгоритм выполнения. подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,664
16.12.2010, 00:22     Разработать рекурсивную функцию
Цитата Сообщение от 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;
        }        
    }
}
 
Текущее время: 14:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru