2014 dxdy logo

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

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




 
 Помогите решить задачу на Си.
Сообщение17.12.2007, 15:00 
Помогите , пожалуйста, написать программу на си.
Вводится слово.Необходимо вывести на экран все слова,которые можно составить из букв вводимого слова.Выводимые слова не обязательно должны иметь смысл.
Например:вводится слово "дима".Выводимы слова такие:
амид
дим
мид
ди
м
и так далее.
Преподаватель требует написать программу через рекурсию.Буду очень благодарен.

 
 
 
 
Сообщение17.12.2007, 15:47 
Аватара пользователя
Я бы решал примерно так. Заводится массив чисел по размеру рассматриваемого алфавита (скажем, можно завести размера 256 по количеству возможных ASCII символов). При считывании слова мы в каждой ячейке суммируем то, сколько раз встречается каждая буква.

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

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

 
 
 
 
Сообщение17.12.2007, 18:27 
Спасибо!Не могли бы Вы написать хотя бы часть кода,а то времени в обрез,в среду экзамен.Буду очень благлдарен. :) :) :)

 
 
 
 
Сообщение17.12.2007, 18:27 
Аватара пользователя
:evil:
PAV писал(а):
Заводится массив чисел по размеру рассматриваемого алфавита (скажем, можно завести размера 256 по количеству возможных ASCII символов).

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

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

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

 
 
 
 
Сообщение17.12.2007, 21:25 
Аватара пользователя
Dmytro Sheludchenko писал(а):
Спасибо!Не могли бы Вы написать хотя бы часть кода,а то времени в обрез,в среду экзамен.Буду очень благлдарен. :) :) :)


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

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

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


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

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

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group