С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 42

Описать рекурсивную функцию DigitCount(S) целого типа

25.02.2014, 23:21. Показов 4109. Ответов 18
Метки нет (Все метки)

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

строки вводим произвольно)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.02.2014, 23:21
Ответы с готовыми решениями:

Описать функцию Digit N (K, N) целого типа, возвращающую N-ю цифру целого положительного числа R
Описать функцию Digit N(K,N) целого типа, возвращающую N-ю цифру целого положительного числа R. (цифры в числе измеряются справа налево)...

Описать функцию Digil Count (k) целого типа, находящую количество цифр целого положительного числа k
Описать функцию Digil Count (k) целого типа, находящую количество цифр целого положительного числа k. Используя эту функцию, найти...

Составить программу, которая содержит рекурсивную функцию Combin2(N,K) целого типа, находящуюся C(N,K) - число сочетаний
помогите составить программу, которая содержит рекурсивную функ-цию Combin2(N, K) целого типа, находящую C(N, K) – число сочетаний из N...

18
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.02.2014, 23:39
Лучший ответ Сообщение было отмечено Апострофф как решение

Решение

Visual Basic
1
2
3
4
5
6
Private Function DigitCount(S As String) As Long
    Static pt As Long
    pt = pt + 1
    If pt <= Len(S) Then DigitCount = DigitCount(S) - (Mid$(S, pt, 1) Like "#")
    pt = pt - 1
End Function
5
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
26.02.2014, 00:15
Лучший ответ Сообщение было отмечено Апострофф как решение

Решение

Другой вариант, более эффективный для ооочень длинных строк
Visual Basic
1
2
3
4
5
6
Function DigitCount1(S As String) As Long
    Static pt As Long
    pt = pt + 1
    If pt < 11 Then DigitCount1 = DigitCount1(S) + Len(S) - Len(Replace$(S, pt - 1, ""))
    pt = pt - 1
End Function
3
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
26.02.2014, 00:47
Лучший ответ Сообщение было отмечено Апострофф как решение

Решение

Цитата Сообщение от Казанский Посмотреть сообщение
более эффективный
Еще более эффективный
Visual Basic
1
2
3
4
5
Private Function DigitCount(s As String) As Long
    Static pt As Long, i As Long
    Dim l As Long
    If i < 10 Then pt = InStr(pt + 1, s, Chr$(i + &H30)): i = i - (pt = 0): l = -(pt > 0): DigitCount = DigitCount(s) + l
End Function
Либо так
Visual Basic
1
2
3
4
5
Private Function DigitCount(s As String) As Long
    Static pt As Long, i As Long
    If i < 10 Then pt = InStr(pt + 1, s, Chr$(i + &H30)): i = i - (pt = 0): _
                   DigitCount = -(pt > 0): DigitCount = DigitCount + DigitCount(s)
End Function
2
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
26.02.2014, 01:06
Цитата Сообщение от The trick Посмотреть сообщение
Еще более эффективный
Возможно. Только работают однократно, i не обнуляется
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
26.02.2014, 01:08
Там нужно еще дописать ветку Else i = 0: pt = 0, чтобы обнулить переменные
Тесты скорости:
Строка 512 рандомных символов:
DigitCount: 0,94504
DigitCount1: 2,42098
Строка 2048 рандомных символов:
DigitCount: 2,96597
DigitCount1: 6,27090
Строка 512 цифр:
DigitCount: 8,20898
DigitCount1: 15,67400
Строка 512 символов без цифр:
DigitCount: 0,51323
DigitCount1: 1,84004
Цикл - 100000 итераций
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
26.02.2014, 01:43
The trick,
а что делать с переполнением стека при числе найденных (числе итераций) ~4900?
Для этой учебной задачи это неважно, а в принципе?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
26.02.2014, 07:03



Visual Basic
1
2
3
Private Function DigitCount(S As String, Optional pt As Integer = 9) As Long
    If pt >= 0 Then DigitCount = DigitCount(S, pt - 1) + UBound(Split(S, CStr(pt)))
End Function
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
26.02.2014, 08:22
Цитата Сообщение от Казанский Посмотреть сообщение
Для этой учебной задачи это неважно, а в принципе?
Увеличить размер стека, иначе использовать другой алгоритм. Для такой задача рекурсия не очень эффективна. Переполнение произойдет только если строка будет содержать одни цифры. Если говорить о рекурсии, то чисто рекурсивный - 1 алгоритм, остальные неявно используют циклы.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
26.02.2014, 09:39
Моя функция только что отработала

Считала 667648 цифр в строке из примерно 2 млн. символов 2582 секунды.1000 итераций. (Честно говоря, запустил и забыл про нее)

Один проход за 2.3 сек.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
26.02.2014, 12:42
Лучший ответ Сообщение было отмечено как решение

Решение

Не претендуя на сверхэффективность:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Function digCounter(S As String, Optional p As Long = 1) As Long
      If Len(S) = p Then
         digCounter = 0
      Else
         d% = Asc(Mid$(S, p, 1))
         If d% >= 48 And d% <= 57 Then
            digCounter = 1 + digCounter(S, p + 1)
         Else
            digCounter = digCounter(S, p + 1)
         End If
      End If
End Function
3
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
26.02.2014, 13:00
ещё пять копеек к эффективности ⁂

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Function digCounter(S As String, Optional p As Long = 1) As Long
      If Len(S) = p Then
         digCounter = 0
      Else
         If IsNumeric(Asc(Mid$(S, p, 1))) Then
            digCounter = 1 + digCounter(S, p + 1)
         Else
            digCounter = digCounter(S, p + 1)
         End If
      End If
End Function
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
26.02.2014, 13:01
Может IsNumeric(Mid$(S, p, 1))?
2
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
26.02.2014, 13:33
а так... без рекурсии ⁂

Visual Basic
1
2
3
4
5
6
7
8
Function digCounter(ByVal S As String) As Long
    Dim f&
    digCounter = Len(S)
    For f = 0 To 9
        S = Replace(S, CStr(f), "")
    Next
    digCounter = digCounter - Len(S)
End Function
Добавлено через 16 минут
здесь в 5-й строчке Asc надо было убрать, не успел ...
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
26.02.2014, 13:37
Лучший ответ Сообщение было отмечено как решение

Решение

FelixMacintosh,
Цитата Сообщение от kseniya0607 Посмотреть сообщение
не используя оператор цикла
Добавлено через 2 минуты
Catstail,
?digCounter("9")
0


Visual Basic
1
2
3
Function DC(S As String, Optional p As Long = 1) As Long
  If Len(S) >= p Then DC = DC(S, p + 1) - IsNumeric(Mid$(S, p, 1))
End Function
паразит апострофф
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
26.02.2014, 17:46
Лучший ответ Сообщение было отмечено Апострофф как решение

Решение

Апострофф, ой!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Function digCounter(S As String, Optional p As Long = 0) As Long
      If Len(S) = p Then
         digCounter = 0
      Else
         d% = Asc(Mid$(S, p+1, 1))
         If d% >= 48 And d% <= 57 Then
            digCounter = 1 + digCounter(S, p + 1)
         Else
            digCounter = digCounter(S, p + 1)
         End If
      End If
End Function
1
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
26.02.2014, 19:16
Цитата Сообщение от Catstail Посмотреть сообщение
ой!
Альтернатива была уже

Добавлено через 55 секунд
Из одной строки
0
26.02.2014, 19:20

Не по теме:

Нет ... хотим из двенадцати ...

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
26.02.2014, 19:50
Цитата Сообщение от Апострофф Посмотреть сообщение
Альтернатива была уже
- и что? Я хочу, чтобы версия моего кода ошибок не содержала.

Добавлено через 13 минут
Конструкция "- IsNumeric(Mid$(S, p, 1))", конечно, компактная... Но вызов функции + преобразование Boolean -> Long требует времени... Может я и ошибаюсь, но замеры производительности дают у меня такое соотношение DC / DigCounter=8 / 6 (в пользу программы из 12 строк).
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.02.2014, 19:50
Помогаю со студенческими работами здесь

Описать рекурсивную функцию Fact(N) вещественного типа, вычисляющую значение факториала
Описать рекурсивную функцию Fact(N) вещественного типа, вычисляющую значение факториала N! = 1·2·. . ·N (N &gt; 0 - параметр целого...

Описать функцию DigitCount (K) целого типа, находящую количество цифр целого положительного числа K
Описать функцию DigitCount (K) целого типа, находящую количество цифр целого положительного числа K. Используя эту функцию, найти...

Описать функцию DigitCount(K) целого типа, находящую количество цифр целого положительного числа K
Описать функцию DigitCount(K) целого типа, находящую количество цифр целого положительного числа K. Используя эту функцию, найти...

Описать функцию DigitCount(K) целого типа, находящую количество цифр целого положительного числа K
Здравствуйте! Проверьте пожалуйста решение задачи. (функции) Описать функцию DigitCount(K) целого типа, находящую количество цифр цело-го...

Описать рекурсивную функцию DigitSum(K) целого типа, которая находит сумму цифр целого числа K
Описать рекурсивную функцию DigitSum(K) целого типа, которая находит сумму цифр целого числа*K, не используя оператор цикла.


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru