0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 1
1

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

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

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток, простите студента заочника, но я вынужден к вам обратиться за помощью. Мне в институте для зачета преподаватель дал задачу для решения: Функция вызывает сама себя 10 раз. Помогите решить пожалуйста, буду вам очень признателен)))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2010, 22:26
Ответы с готовыми решениями:

Зачем функция вызывает саму себя?
#include <stdio.h> #include <vector> int g; bool used; int n, m; //поясните мне эту...

Подскажите немножко с рекурсией ( Функция должна вызывать сама себя до тех пор пока sum не станет больше х)
Вводим число х. Функция должна вызывать сама себя до тех пор пока sum не станет больше х. Но...

Функция сама себя вызывает бесконечно
Всем привет. Имеется две функции, одна вызывает другую при выборе варианта из селект бокса. Так же...

Поясните. Функция вызывает сама себя без присваивания
static private ArrayList RecConvert(int BigNumber,ArrayList AnswerNumber,int len) { int...

37
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 17:01 21
Author24 — интернет-сервис помощи студентам
Kastaneda, не в обиду будет сказано, но я даже не могу решить для себя, что это - эзотерика или быдлокод
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
22.12.2010, 17:08 22
Цитата Сообщение от Nameless One Посмотреть сообщение
Kastaneda, не в обиду будет сказано, но я даже не могу решить для себя, что это - эзотерика или быдлокод
Естественно и даже бесспорно такое нельзя применять в работе. "эзотерика или быдлокод" - это творчество)))
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.12.2010, 17:36 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;
}
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 17:39 24
ForEveR, тогда уж лучше вынести rec и foo в другой файл, и сделать rec статической функцей, чтобы ее не было видно в других единицах трансляции
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
22.12.2010, 17:41 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
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 17:45 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);
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.12.2010, 17:45 27
Kastaneda, Проверял. До 10 доходит. От 1 до 10

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

Не по теме:

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

0
Заблокирован
22.12.2010, 17:55 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);
}
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 18:02 30
Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, вот еще вариант для тех, кто компилирует компилятором gcc:
Это не вариант решения задачи, т.к. в нем вызывается 10 раз не функция rec(), а вложенная функция printtimes(...) - еще раз внимательно читаем условие задачи.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 18:07 31
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
ну, если в ход пошел exit(0);
В языке C вызов функции exit в теле main полностью аналогичен оператору return.

Цитата Сообщение от Напильнег Посмотреть сообщение
Это не вариант решения задачи, т.к. в нем вызывается 10 раз не функция rec(), а вложенная функция printtimes(...) - еще раз внимательно читаем условие задачи.
Милейший, может быть, это Вы еще раз прочитаете условие задачи?
Цитата Сообщение от maximus11 Посмотреть сообщение
Функция вызывает сама себя 10 раз
Тут ничего не было сказано про то, какая эта функция должна быть, должны ли у нее быть параметры, должна ли она использовать глобальные или статические локальные переменные. Так что не надо, выдавая свои домыслы за жесткие требования, пуд*ить нам моз*и (извиняюсь за свой французский). Мы и так поняли, что Вы программист с неординарными качествами, поэтому, может быть, Вы оставите эту многострадальную тему в покое?
3
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 18:42 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 Посмотреть сообщение
+ лучше читается (и понимается) код
По мне так хуже, и читается и понимается.
0
Kastaneda
22.12.2010, 18:55
  #33

Не по теме:

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

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

И да, рекурсия в моей функции - хвостовая, поэтому некоторые компиляторы могут ее оптимизировать
2
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.12.2010, 19:18 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;
}
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 19:21 36
Цитата Сообщение от Nameless One Посмотреть сообщение
Милейший, может быть, это Вы еще раз прочитаете условие задачи?
Можно и еще раз:
Цитата Сообщение от maximus11 Посмотреть сообщение
Мне в институте для зачета преподаватель дал задачу для решения: Функция вызывает сама себя 10 раз.
Коряво написано, собственно нет даже глагола в побудительном наклонении, так что формально это не постановка задачи вообще, об чем спор.

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

И это не ограничения, а то, как принимается по умолчанию. Это как по умолчанию среди приличных людей принято не сморкаться в занавески, хотя об этом нигде и не написано.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 19:28 37
Цитата Сообщение от Напильнег Посмотреть сообщение
...она при этом вызовет себя рекурсивно 10 раз (причем сделает это сама, по факту вызова, а не ориентируясь на переданный из внешнего вызова параметр!)...
Лично вот эта часть (про параметр) сильнее всего походит на твой домысел, но так как этой спор уже приближается к уровню флейма, предлагаю оставить этот вопрос. Мне, как я вижу, тебя не переубедить, и уверяю тебя, тебе меня тоже
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
22.12.2010, 20:07 38
Лучший ответ Сообщение было отмечено как решение

Решение

Напильнег, конечно же Вы правы! И единственное (ну по крайней мере первое) абсолютно верное решение тоже было Вами предоставлено! Мало того - ни Страуструпп ни Керниган с Ричи лучше не написали бы. Жаль, что не увидят...
На этой радостной оптимистической ноте и закрою тему. Желающие лично выразить восхищение Напильнег, пишите ему в ЛС.
3
22.12.2010, 20:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2010, 20:07
Помогаю со студенческими работами здесь

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

Создать файл с html формой которая вызывает сама себя
Ребята, очень прошу, помогите пожалуйста с кодом! Только начали изучение языка - разобраться не...

Нужно, чтобы форма распечатала сама себя, или только часть себя
Помогите, плиз! Нужно, чтобы форма (для этого имеется кнопка на форме) распечатала сама себя, или...

Программа, выводящая сама себя
Цель - написать такую программу, используя минимальное количество средств (я знаю только питон,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru