Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 11.12.2013
Сообщений: 58

Множественный рекурсивный вызов функции

09.09.2015, 17:52. Показов 1072. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
hello world... еще раз))
то о что меня интересует вероятно есть в языке, я не знаю как эта штука называется но вот чувство такое есть что нужная мне фича задается каким то символом или оператором...
в общем... я пытаюсь сделать bfs
взял я бумагу и карандаш, пишу пишу и никак не получается, вот что набросал
Haskell
1
2
3
4
5
6
7
8
bFSearch start finish visited = bFSearch` [] (getAdjacent start)  -- вот тут проблема
    where bFSearch` res current = (
        if (finish == current)
            then res ++ current
            else (
                if (current `elem` visited)
                    then " "
                    else bFSearch` (res ++ current) (getAdjacent current))) -- и вот тут
там где есть значок "--вот тут", возникают проблемы, теперь подробнее:
getAdjacent - функция которая возвращает смежные элементы, она возвращает список, bFSearch` принимает в последнем аргументе элемент а не список, и я как раз не могу понять как мне так вызвать рекурсивно эту функцию к различным элементам получаемого списка
еще есть и другая проблема, так как это функциональный язык, то мне не совсем понятно как в переменную visited добавлять элементы при каждом посещении вершины... (все в тех же строках где я вызываю bFSearch`)
показать функцию getAdjacent не могу, она довольно большая... могу лишь сказать что она мне совершенно точно возвращает список смежных вершин...
вот...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.09.2015, 17:52
Ответы с готовыми решениями:

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

рекурсивный вызов функции-члена
как осуществить рекурсивный вызов функции члена?

Косвенный рекурсивный вызов функции
Добрый вечер. Пишу программу, вычисляющую массивы. Внутри программы есть две(пока что одна) задачи, которые она выполняет(две функции)....

5
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
09.09.2015, 18:34
Может быть тебе поможет вот этот код. Он рабочий, хотя и не слишком изящный:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mark :: [Int] -> Int -> Int -> [Int]
mark chk n m | (n == 0) = m : (tail chk)
             | otherwise = (head chk) : (mark (tail chk) (n-1) m)
 
newV :: [[Int]] -> Int -> [Int] -> [Int] -> [Int]
newV g n chk que = (filter (\ x -> (chk !! x) == 0) (g !! n))
 
setP :: [Int] -> Int -> [Int] -> [Int]
setP pth n [] = pth
setP pth n (f:fs) = setP (mark pth f n) n fs
 
bfs' :: [[Int]] -> [Int] -> [Int] -> [Int] -> [Int]
bfs' g [] chk pth  = pth 
bfs' g que chk pth = (bfs' g (tq ++ nV) (setP chk 1 nV) (setP pth hq nV))
                     where tq=(tail que); hq=(head que); nV=(newV g hq chk tq);
 
showPath :: [Int] -> Int -> [Int]
showPath pth n | (pth !! n) == negate 1 = [n]
               | otherwise = n : (showPath pth (pth !! n))
                    
bfs :: [[Int]] -> Int -> Int -> [Int]  -- главная функция
bfs g n m = reverse $ showPath (bfs' g [n] (mark chk n 1) pth) m 
            where chk=(take k (repeat 0)); pth=(mark chk n (negate 1)); k=length g
Главная функция принимает граф, заданный списком смежности вершин, начальную вершину n и конечную вершину m , а возвращает путь из начальной в конечную, получающийся обходом в ширину (для невзвешенного графа это кратчайший путь из n в m)

Haskell
1
2
3
4
Main> bfs [[1,2],[0,2,3,4],[0,1,4],[1,4],[1,2,3,5],[4,6],[5]] 0 6
[0,1,4,5,6]
Main> bfs [[1,2],[0,2,3,4],[0,1,4],[1,4],[1,2,3,5],[4,6],[5]] 2 5
[2,4,5]
2
2 / 2 / 0
Регистрация: 11.12.2013
Сообщений: 58
09.09.2015, 18:44  [ТС]
ммм(((
тут вообще какой то ад...
фишка в том что у меня нету графа как такового в программе (списком смежности или еще как то), у меня есть множество слов, и смежность между ними задается функцией, собственно я могу вернуть смежные вершины воспользовавшись своей функцией getAdjacent

Добавлено через 6 минут
построить граф по этому списку - нереально долго... ладно... спрошу у одногруппников переделывали ли они в граф
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
09.09.2015, 18:55
Как я понял, есть конечное множество строк (слов). И есть алгоритм, который показывает, какие слова являются смежными. Опиши этот алгоритм.
0
2 / 2 / 0
Регистрация: 11.12.2013
Сообщений: 58
09.09.2015, 19:34  [ТС]
ну... грубо говоря задача стоит такая:
есть словарь русского языка
даны два слова
узнать, можно ли единичными шагами перейти от одного слова к другому, за шаг понимается переход от одного слова к другому если они отличаются всего на 1 букву
(муха - мула - кула - кила - килт - киот - клот - клон - слон)
понятное дело что строить по словарю такой граф... лишние затраты
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
09.09.2015, 20:30
В задачу не вникаю — на вопрос отвечаю

el_razor, если не приводишь реализацию функций, то напиши их типы. Это относится вообще ко всему коду.
Скажем, по описанию я понял, что current — это элемент, но фраза res ++ current напрягает.
Цитата Сообщение от el_razor Посмотреть сообщение
я как раз не могу понять как мне так вызвать рекурсивно эту функцию к различным элементам получаемого списка
Если хочется вызвать функцию на списке — есть map и concatMap.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2015, 20:30
Помогаю со студенческими работами здесь

Ret и рекурсивный вызов функции
Данный код вычисляет f(n)=1+2+3+...+n, т.е. сумму арифметической последовательности до n. Вычисление производится рекурсивно в функции...

Рекурсивный вызов функции main
Не понимаю, где здесь рекурсивный вызов main() будет? Написал такой код: #include<iostream> using namespace std; ...

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

Используя рекурсивный вызов функции вычислить сумму заданного числа элементов ряда
В программировании я просто дуб дубом, но нужно срочно сделать одну задачу в Qt. Сама задача: Используя рекурсивный вызов функции...

IdHTTP метод WorkBegin множественный вызов
Создаю запрос в idHTTP, отправляю его в post режиме. Это всё происходит в отдельном потоке. Код : slRaw = new TStringList(); m...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru