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

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

25.02.2014, 23:21. Показов 4162. Ответов 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
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
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 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 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
26.02.2014, 19:16
Цитата Сообщение от Catstail Посмотреть сообщение
ой!
Альтернатива была уже

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

Не по теме:

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

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,737
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru