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

Однократный вызов рекурсивной функции

11.01.2021, 23:26. Показов 1284. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем наилучшего из времен суток. Собственно, в карьер. Мне нужно написать функцию, которая будет единожды вызывать сама себя. Как это можно сделать? ( Очевидный вариант - передавать в нее маркер вызова как параметр, но очень уж на костыль похоже такое решение( Очень обидно при оригинальном вызове передавать в функцию константу))

Отдельно прошу отметить, что пишу на чистом Си, а не на пллюсах. Не знаю, повлияет-ли, но вдруг?

Если в ответе будет пример - вдвойне спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2021, 23:26
Ответы с готовыми решениями:

Бесконечный цикл в рекурсивной функции
#include <stdio.h> #include <stdlib.h> #include <math.h> float f(float n){ float...

Как прописать указатель в рекурсивной функции?
Пытаюсь рекурсивно посчитать факториал числа используя указатели. Чтобы хоть как то всё заработало...

С помощью рекурсивной функции вычислить сумму
Дано натуральное n, действительные a1,a2,...,an.С помощью рекурсивной функции вычислить сумму...

Подсчитать количество вызовов рекурсивной функции
подскажите пожалуйста что сделал не так написал рекурсивный вариант програмы по факторизации...

10
Заблокирован
12.01.2021, 01:49 2
Лучший ответ Сообщение было отмечено TiARETiK как решение

Решение

TiARETiK, в чём проблема я так и не понял?

Добавлено через 8 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int 
fun(void) {
    static int acc = 0;
    printf("Вызов номер = %d\n", acc);
    if(acc >= 5) {
        printf("Конец рекурсии\n");
        return 0;
    } else {
    acc += 1;
    return fun();
     }        
    }
 
 
int 
main() {
    
   fun();
 
 return 0;
}
2
0 / 0 / 1
Регистрация: 15.12.2015
Сообщений: 31
15.01.2021, 01:53  [ТС] 3
Вот ей богу, ни разу в жизни не использовал статические переменные. Как-то не доводилось. И забыл совсем про них. Спасибо!)
P.S. Благополучно разбил все что нужно на четыре метающихся в друг-друга указателями функции, и забыл, что задал вопрос)
0
Заблокирован
15.01.2021, 13:53 4
Цитата Сообщение от TiARETiK Посмотреть сообщение
Вот ей богу, ни разу в жизни не использовал статические переменные. Как-то не доводилось. И забыл совсем про них
бывает
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
15.01.2021, 14:35 5
RatPoison, ваше решение ошибочно. Вызовите fun несолько раз и увидите в чем дело.
TiARETiK, Решением проблемы является обычный триггер в виде все той же статической переменной:
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
foo(const char * str) {
  static int trigger = 0;
  trigger = !trigger;
 
  fprintf(stdout, "%s\n", str);
  if ( trigger ) {
    foo("yet another call");
  }
} 
 
int 
main(int argc, char * argv[]) {
  foo("first call");
  foo("first call"); 
  foo("first call");
 
  exit(EXIT_SUCCESS);
}
Bash
1
2
3
4
5
6
7
8
9
~/src:$ clang -pedantic  ./sample.c 
~/src:$ ./a.out 
first call
yet another call
first call
yet another call
first call
yet another call
~/src:$
2
Заблокирован
15.01.2021, 14:57 6
zeroalef, я просто показал автору инструмент. Да, статическая переменная накопить нужный счётчик и при втором вызове функция стразу завершится. Но автор спросил, как один раз вызывать рекурсивную функцию.

Добавлено через 9 минут
можно обойтись и без статической переменной.

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>
 
void
fun(int acc, int stop) {
    if (acc > stop) {
        printf("Конец рекурсии.");
    } else {
        printf("Вызов номер: %d\n", acc);
        acc += 1;
        fun(acc, stop);
    }
}
 
 
int main() {
    
    fun(0, 5);
    fun(0, 10);
 
    return 0;
}
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
15.01.2021, 15:05 7
Цитата Сообщение от RatPoison Посмотреть сообщение
можно обойтись и без статической переменной
static тут как раз то что нужно. Главное -- правильно составить логику триггера. Тогда можно добиться, например, вызова рекурсии при каждом третьем вызове, или при каждом втором и т.д. У человека наипростейший случай примитивного триггера.
0
Заблокирован
15.01.2021, 15:07 8
Цитата Сообщение от zeroalef Посмотреть сообщение
гда можно добиться, например, вызова рекурсии при каждом третьем вызове, или при каждом втором и т.д
это уже кому что нужно
0
0 / 0 / 1
Регистрация: 15.12.2015
Сообщений: 31
15.01.2021, 23:57  [ТС] 9
Цитата Сообщение от RatPoison Посмотреть сообщение
можно обойтись и без статической переменной.
До такого варианта и сам дошел, но, повторюсь, выглядит как костыль. Какой-то внутренний жадина говорит, что постоянная передача в функцию лишнего параметра( а она должна вызываться много-много раз за секунду) - это плохо.
0
Заблокирован
16.01.2021, 00:11 10
Цитата Сообщение от TiARETiK Посмотреть сообщение
Какой-то внутренний жадина говорит, что постоянная передача в функцию лишнего параметра( а она должна вызываться много-много раз за секунду) - это плохо.
Да, лучше обойтись без лишних параметров.
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
17.01.2021, 17:53 11
Цитата Сообщение от TiARETiK Посмотреть сообщение
Какой-то внутренний жадина говорит, что постоянная передача в функцию лишнего параметра( а она должна вызываться много-много раз за секунду) - это плохо.
Компилятор какой используете? В gcc возможно использование передачи до двух параметров через регистры ecx, edx на архитектуре x86_32 при указании атрибута у функции fastcall. Соответственно, стек не расходуется, адресация и производительность без накладных расходов.
0
17.01.2021, 17:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2021, 17:53
Помогаю со студенческими работами здесь

Вычислить значение выражения с помощью рекурсивной функции
Есть условие: нужно вычислить значение выражения типа V1+V2+Vn, с помощью рекурсивной функции. ...

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

Вычислить значение выражения с помощью рекурсивной функции
S=ln(1+a)

Вызов рекурсивной функции
Здравствуйте! У меня есть вот такой код к задаче. Но я не очень понимаю, как могут вызываться сразу...

Вызов рекурсивной функции в отдельном потоке
Добрый день. Пытаюсь реализовать рекурсивный поиск файлов по заданной маске по каталогам в...

Однократный вызов скрипта с помощью ExternalInterface.call
В коде приложения: ExternalInterface.call('test') В js: function test() {alert('FOR?');} По...


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

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

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