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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.97
maximus11
Сообщений: n/a
#1

Функция вызывает сама себя 10 раз - C++

21.12.2010, 22:26. Просмотров 4086. Ответов 37
Метки нет (Все метки)

Всем доброго времени суток, простите студента заочника, но я вынужден к вам обратиться за помощью. Мне в институте для зачета преподаватель дал задачу для решения: Функция вызывает сама себя 10 раз. Помогите решить пожалуйста, буду вам очень признателен)))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2010, 22:26     Функция вызывает сама себя 10 раз
Посмотрите здесь:

Почему встроенная функция вызывает конструктор копирования? C++
Функция с переменным количеством аргументов вызывает out of memory C++
C++ Как зделать чтоб программа удалила сама себя
C++ Функция компилируется, но вызывает виндовс ошибку
C++ Ведется набор цифр и надо чтобы программа из него сама сообразило число. То есть что бы программа сама раскидывала их по разрядам.
C++ функция возвращающая аргументу его значение сама по себе
C++ Подскажите немножко с рекурсией ( Функция должна вызывать сама себя до тех пор пока sum не станет больше х)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
22.12.2010, 17:01     Функция вызывает сама себя 10 раз #21
Kastaneda, не в обиду будет сказано, но я даже не могу решить для себя, что это - эзотерика или быдлокод
Kastaneda
Форумчанин
Эксперт С++
4258 / 2790 / 219
Регистрация: 12.12.2009
Сообщений: 7,119
Записей в блоге: 1
Завершенные тесты: 1
22.12.2010, 17:08     Функция вызывает сама себя 10 раз #22
Цитата Сообщение от Nameless One Посмотреть сообщение
Kastaneda, не в обиду будет сказано, но я даже не могу решить для себя, что это - эзотерика или быдлокод
Естественно и даже бесспорно такое нельзя применять в работе. "эзотерика или быдлокод" - это творчество)))
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.12.2010, 17:36     Функция вызывает сама себя 10 раз #23
Можно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
void rec(int x)
{
    if(x >= 10)
       return;
    std::cout<<"Recurive call of function rec number "<< ++x <<'\n';
    rec(x);
}
 
void foo()
{
    int x=0;
    rec(x);
}
 
int main()
{
    foo();
    return 0;
}
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
22.12.2010, 17:39     Функция вызывает сама себя 10 раз #24
ForEveR, тогда уж лучше вынести rec и foo в другой файл, и сделать rec статической функцей, чтобы ее не было видно в других единицах трансляции
Kastaneda
Форумчанин
Эксперт С++
4258 / 2790 / 219
Регистрация: 12.12.2009
Сообщений: 7,119
Записей в блоге: 1
Завершенные тесты: 1
22.12.2010, 17:41     Функция вызывает сама себя 10 раз #25
ForEveR,
Bash
1
2
3
4
5
6
$./a.exe
Recurive call of function rec number 1
Recurive call of function rec number 3
Recurive call of function rec number 5
Recurive call of function rec number 7
Recurive call of function rec number 9
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
22.12.2010, 17:45     Функция вызывает сама себя 10 раз #26
Кстати, вот еще вариант для тех, кто компилирует компилятором gcc:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
void rec()
{
    void printtimes(const char* str, size_t times)
    {
        if(!times)
            return;
        
        puts(str);
        printtimes(str, --times);
    }
    
    printtimes("Hello, World!", 10);
}
 
int main()
{
    rec();      
    exit(0);
}
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.12.2010, 17:45     Функция вызывает сама себя 10 раз #27
Kastaneda, Проверял. До 10 доходит. От 1 до 10

Nameless One, да, это будет лучше.
Kastaneda
22.12.2010, 17:52
  #28

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, Проверял. До 10 доходит.
ForEveR, так ты исходник подредактировал)) Там была "опечатка", я на нее хотел указать)

Dzhej-Dzhej
Заблокирован
22.12.2010, 17:55     Функция вызывает сама себя 10 раз #29
ну, если в ход пошел exit(0);
тогда можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
void func(int i)
{
    std::cout<<i<<std::endl;
    if(i<10) func(++i);
    system("pause");
    exit(0);
} 
int main()
{
    func(1);
}
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 18:02     Функция вызывает сама себя 10 раз #30
Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, вот еще вариант для тех, кто компилирует компилятором gcc:
Это не вариант решения задачи, т.к. в нем вызывается 10 раз не функция rec(), а вложенная функция printtimes(...) - еще раз внимательно читаем условие задачи.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
22.12.2010, 18:07     Функция вызывает сама себя 10 раз #31
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
ну, если в ход пошел exit(0);
В языке C вызов функции exit в теле main полностью аналогичен оператору return.

Цитата Сообщение от Напильнег Посмотреть сообщение
Это не вариант решения задачи, т.к. в нем вызывается 10 раз не функция rec(), а вложенная функция printtimes(...) - еще раз внимательно читаем условие задачи.
Милейший, может быть, это Вы еще раз прочитаете условие задачи?
Цитата Сообщение от maximus11 Посмотреть сообщение
Функция вызывает сама себя 10 раз
Тут ничего не было сказано про то, какая эта функция должна быть, должны ли у нее быть параметры, должна ли она использовать глобальные или статические локальные переменные. Так что не надо, выдавая свои домыслы за жесткие требования, пуд*ить нам моз*и (извиняюсь за свой французский). Мы и так поняли, что Вы программист с неординарными качествами, поэтому, может быть, Вы оставите эту многострадальную тему в покое?
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 18:42     Функция вызывает сама себя 10 раз #32
Цитата Сообщение от ForEveR Посмотреть сообщение
Напильнег, А не надо вызывать его второй раз) Если создать новый объект и вызвать - то опять же 10)
В задании требуется написать функцию, которая будучи вызвана, вызывает себя рекурсивно 10 раз. Про зависимость от истории вызовов ничего не сказано, это подразумевает отсутствие такой зависимости.

Цитата Сообщение от ForEveR Посмотреть сообщение
Все варианты выполняют задание. Через статик переменную это более топорно чем через функцию как у easybudda.
Нет, на момент отквоченного сообщение только мой. Решение от easybudda есть решение несколько другой задачи, это было объяснено чуть не по складам выше, так что оценивать его эстетичность некорректно.

Добавлено через 24 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
Ну тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void tentimes()
{
        static size_t times = 10;
        
        if(!times)
        {
                times = 10;
                return;
        }
        
        printf("tentimes function's been called...\n");
        --times;
        
        tentimes();
}
Так можно, но менее кузяво. Если уж счетчик глубины рекурсивных вызовов ведется, то не грех поддерживать его в актуальном состоянии - мало ли зачем пригодится.

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

Цитата Сообщение от Nameless One Посмотреть сообщение
Меньше ненужных операций
Да - путем мозгового штурма и усложнения кода удалось сэкономить аж целый ++times

Цитата Сообщение от Nameless One Посмотреть сообщение
+ лучше читается (и понимается) код
По мне так хуже, и читается и понимается.
Kastaneda
22.12.2010, 18:55
  #33

Не по теме:

Цитата Сообщение от Напильнег Посмотреть сообщение
форум таки родил второе правильное решение
Здесь все решения правильные, и можно еще штук 10 настрочить. Условия задачи дано так, что "правильное решение" имеет очень широкий диапазон.

Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
22.12.2010, 19:10     Функция вызывает сама себя 10 раз #34
Цитата Сообщение от Напильнег Посмотреть сообщение
Да - путем мозгового штурма и усложнения кода удалось сэкономить аж целый ++times
Неа. У тебя на каждый инкремент приходится декремент, т.е. для функции, которая вызывается 10 раз, приходится 20 операций изменения статической переменной, против 11 у меня.
Цитата Сообщение от Напильнег Посмотреть сообщение
Если уж счетчик глубины рекурсивных вызовов ведется, то не грех поддерживать его в актуальном состоянии - мало ли зачем пригодится.
Например?
Цитата Сообщение от Напильнег Посмотреть сообщение
Тем не менее, нельзя не отметить как положительный сдвиг то, что с божьей помощью и ценой неимоверных потуг с нескольких попыток форум таки родил второе правильное решение
У кого-то явно завышенное самомнение. Причем, судя по всему, завышенное необоснованно.
Цитата Сообщение от Напильнег Посмотреть сообщение
По мне так хуже, и читается и понимается.
Ну, это вопрос спорный и субъективный. Рекурсивная функция должна иметь:
  1. условие остановки;
  2. некоторый код, который проводит полезную работу;
  3. собственно рекурсивный вызов самой себя.
У меня это проглядывается гораздо четче, ИМХО

И да, рекурсия в моей функции - хвостовая, поэтому некоторые компиляторы могут ее оптимизировать
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.12.2010, 19:18     Функция вызывает сама себя 10 раз #35
Изврат. Но условие выполняется... Вызывает 10 раз саму себя. Здесь тоже что-то не по условию?

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
#include <iostream>
 
class Function
{
private:
   int x;
public:
   Function(int x_=0):x(x_)
   {
   }
   template<class Foo>
   void operator() (Foo pred)
   {
        pred(x);
        x=0;
   }
};
 
void rec(int x)
{
    if(x >= 10)
        return;
    std::cout<<++x<<" Call of function\n";
    rec(x);
}
 
int main()
{
    Function Ob;
    Ob(rec);
    return 0;
}
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 19:21     Функция вызывает сама себя 10 раз #36
Цитата Сообщение от Nameless One Посмотреть сообщение
Милейший, может быть, это Вы еще раз прочитаете условие задачи?
Можно и еще раз:
Цитата Сообщение от maximus11 Посмотреть сообщение
Мне в институте для зачета преподаватель дал задачу для решения: Функция вызывает сама себя 10 раз.
Коряво написано, собственно нет даже глагола в побудительном наклонении, так что формально это не постановка задачи вообще, об чем спор.

Но если "переводить" с точки зрения здравого смысла, то это означает, что требуется написать функцию, которую можно вызвать из любого расположенного после ее декларации места основной программы или подпрограммы (а не только из функции-контейнера!), и она при этом вызовет себя рекурсивно 10 раз (причем сделает это сама, по факту вызова, а не ориентируясь на переданный из внешнего вызова параметр!), причем функционал ее не зависит от истории вызовов.

И это не ограничения, а то, как принимается по умолчанию. Это как по умолчанию среди приличных людей принято не сморкаться в занавески, хотя об этом нигде и не написано.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
22.12.2010, 19:28     Функция вызывает сама себя 10 раз #37
Цитата Сообщение от Напильнег Посмотреть сообщение
...она при этом вызовет себя рекурсивно 10 раз (причем сделает это сама, по факту вызова, а не ориентируясь на переданный из внешнего вызова параметр!)...
Лично вот эта часть (про параметр) сильнее всего походит на твой домысел, но так как этой спор уже приближается к уровню флейма, предлагаю оставить этот вопрос. Мне, как я вижу, тебя не переубедить, и уверяю тебя, тебе меня тоже
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 20:07     Функция вызывает сама себя 10 раз
Еще ссылки по теме:

Функция должна принять указатель на саму себя C++
C++ Программа, запускающая сама себя
Как вычислить интеграл, если сама функция вычисляется с очень большой погрешностью? (ужасная точность) C++
что делает size_t в данной функции, и сама функция C++
Странно ведёт себя функция fgets C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
22.12.2010, 20:07     Функция вызывает сама себя 10 раз #38
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Напильнег, конечно же Вы правы! И единственное (ну по крайней мере первое) абсолютно верное решение тоже было Вами предоставлено! Мало того - ни Страуструпп ни Керниган с Ричи лучше не написали бы. Жаль, что не увидят...
На этой радостной оптимистической ноте и закрою тему. Желающие лично выразить восхищение Напильнег, пишите ему в ЛС.
Yandex
Объявления
22.12.2010, 20:07     Функция вызывает сама себя 10 раз
Закрытая тема Создать тему
Опции темы

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