2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите решить задачу на Си.
Сообщение17.12.2007, 15:00 


06/10/07
68
Sverige
Помогите , пожалуйста, написать программу на си.
Вводится слово.Необходимо вывести на экран все слова,которые можно составить из букв вводимого слова.Выводимые слова не обязательно должны иметь смысл.
Например:вводится слово "дима".Выводимы слова такие:
амид
дим
мид
ди
м
и так далее.
Преподаватель требует написать программу через рекурсию.Буду очень благодарен.

 Профиль  
                  
 
 
Сообщение17.12.2007, 15:47 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Я бы решал примерно так. Заводится массив чисел по размеру рассматриваемого алфавита (скажем, можно завести размера 256 по количеству возможных ASCII символов). При считывании слова мы в каждой ячейке суммируем то, сколько раз встречается каждая буква.

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

Функция работает так. Она перебирает все возможные буквы. Если значение в соответствующей ячейке положительно (т.е. еще есть свободные такие буквы), то делаем следующее: уменьшаем на 1 этот счетчик, приписываем букву в конец имеющейся строки, выводим ее на печать (так как это новое допустимое слово), а затем запускаем рекурсивно ту же функцию, которая всеми возможными способами дополнит эту строку, используя оставшиеся буквы. После отработки функции не забываем вернуть все, как было: обратно увеличить на 1 этот счетчик и удалить букву из конца строки. Переходим к следующей букве. Когда все буквы закончатся, возвращаем управление.

 Профиль  
                  
 
 
Сообщение17.12.2007, 18:27 


06/10/07
68
Sverige
Спасибо!Не могли бы Вы написать хотя бы часть кода,а то времени в обрез,в среду экзамен.Буду очень благлдарен. :) :) :)

 Профиль  
                  
 
 
Сообщение17.12.2007, 18:27 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
PAV писал(а):
Заводится массив чисел по размеру рассматриваемого алфавита (скажем, можно завести размера 256 по количеству возможных ASCII символов).

Лучше заводить не по числу букв в алфавите, а по числу букв в слове. Нам ведь всё равно, в каком они порядке. А вот считать — гораздо меньше. В экспоненту раз.

Массив счётчиков можно (и лучше) сделать глобальным (атрибутом класса в С++). Т.е., если передавать ссылку, большого греха нет, а вот копировать весь массив на каждом вызове больно и обидно.

Очень полезно поизгаляться со списком доступных (ненулевых) букв: разница в скорости может оказаться разницей между принятой программой и незачётом.

 Профиль  
                  
 
 
Сообщение17.12.2007, 21:25 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Dmytro Sheludchenko писал(а):
Спасибо!Не могли бы Вы написать хотя бы часть кода,а то времени в обрез,в среду экзамен.Буду очень благлдарен. :) :) :)


Нет, код я писать не буду.

Добавлено спустя 5 минут 50 секунд:

незваный гость писал(а):
Т.е., если передавать ссылку, большого греха нет, а вот копировать весь массив на каждом вызове больно и обидно.


Конечно же, передавать нужно адрес массива. Копировать его не нужно. Использовать для букв иные индексы, чем банально коды ASCII, конечно же можно. Использовать списки тоже приятно, но это в целом чуть выходит за рамки совсем стандартной учебной программы. При этом некоторых дополнительных усилий потребует возвращение к исходному виду после обработки очередной буквы. Хотя это все равно все легко, конечно.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group