Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 3

Количество десятичных цифр числа n

19.12.2016, 20:45. Показов 3014. Ответов 5

Студворк — интернет-сервис помощи студентам
Требуется решить две задачи с использованием рекурсии, но без &optional, initial element, т.к я не понимаю принципа их работы.
Дано натуральное число N. Определить функцию, зависящую от N, которая находит количество цифр числа N.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2016, 20:45
Ответы с готовыми решениями:

Найти количество шестизначных билетов у которых сумма первых 3 десятичных цифр равно сумме трех последних десятичных цифр
3) дданы целые положительные M и N (100000<=M<= N) найти колличество билетов с 6-и значными номерами от M до N у которых сумма первых 3...

Вывести количество десятичных цифр натурального числа
Допустим, дано число 11324. Как вывести на экран их количество (ответ в данном случае 5).

Функция определяющая количество четных десятичных цифр числа
Помогите, пожалуйста, отредактировать код. Он считывает только одну цифру при вводе, а не 10. Задача: В этой задаче вы должны написать...

5
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
19.12.2016, 23:53
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Рекурсивное решение:

Lisp
1
2
3
4
(defun cifr (n)
  (cond
    ((zerop n) 0)
    (t (1+ (cifr (floor n 10))))))
Если число равно 0, считаю, что в нём 0 цифр. Иначе: делю на 10 (с остатком), нахожу количество цифр и добавляю 1.

В ряде случаев предпочитают решать через использование "аккумулятора" - специальной переменной, в которой "накапливают" ("аккумулируют") значение.

Lisp
1
2
3
4
5
6
7
(defun cifr-acc (n acc)
  (cond
    ((zerop n) acc)
    (t (cifr-acc (floor n 10) (1+ acc)))))
 
(defun cifr (n)
  (cifr-acc n 0))
В переменной acc запоминается количество сделанных делений. На каждой итерации мы делим n на 10 (при этом количество цифр в n уменьшается на 1) и увеличиваем acc на 1. В результате, количество цифр в числе n плюс значение переменной acc остаётся неизменным.

В конце n станет равным нулю, а acc станет равным количеству цифр в исходном числе.

Если проследить вызовы, это выглядит так:

(cifr 1234)

(cifr-acc 1234 0)

(cifr-acc 123 1)

(cifr-acc 12 2)

(cifr-acc 1 3)

(cifr 0 4)

4

Если захотите узнать подробней - погуглите термины "инвариант цикла", "хвостовая рекурсия".

В этом решении есть небольшое неудобство - приходится писать две функции вместо одной. Но, можно немного сжульничать и применить "&optional".

Lisp
1
2
3
4
(defun cifr (n &optional (acc 0))
  (cond
    ((zerop n) acc)
    (t (cifr-acc (floor n 10) (1+ acc)))))
Я взял функцию cifr-acc из предыдущего решения и сделал в нём параметр acc необязательным. Также я указал значение по умолчанию для переменной acc - это число 0.

Теперь, если я вызову "(cifr 1234)", лисп увидит, что я не указал значение переменной acc и подставит значение по умолчанию, и последовательность вызовов будет выглядеть так:

(cifr 1234 0)

(cifr 123 1)

(cifr 12 2)

(cifr 1 3)

(cifr 0 4)

Аванес, сначала освойте рекурсию, потом разберитесь с использованием накапливаемого значения ("аккумуляторов"). А в самом "&optional" сложностей нет никаких.
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
20.12.2016, 09:51
Цитата Сообщение от rdt Посмотреть сообщение
Если число равно 0, считаю, что в нём 0 цифр.
- это почему же? Ноль - такая же цифрра, как и все прочие.
3
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
20.12.2016, 18:26
Ноль не всегда считают натуральным числом. Исходя из этого, я доопределил в нуле функцию так, чтоб код был возможно проще.

Но, судя по всему, в задаче подразумевалось, что 0 считаем натуральным числом, и для него функция должна выдавать результат: 1 цифра.

Вот исправленные версии кода:

Lisp
1
2
3
4
(defun cifr (n)
  (cond
    ((<= n 9) 1)
    (t (1+ (cifr (floor n 10))))))
Lisp
1
2
3
4
5
6
7
(defun cifr-acc (n acc)
  (cond
    ((<= n 9) acc)
    (t (cifr-acc (floor n 10) (1+ acc)))))
 
(defun cifr (n)
  (cifr-acc n 1))
Lisp
1
2
3
4
(defun cifr (n &optional (acc 1))
  (cond
    ((<= n 9) acc)
    (t (cifr-acc (floor n 10) (1+ acc)))))
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
21.12.2016, 09:17
В HomeLisp задача решается без рекурсии совсем просто:

Lisp
1
2
(defun num-digs (n)
  (length (explode n)))
1
 Аватар для _sg
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
21.12.2016, 09:23
вариант:
Lisp
1
2
3
4
5
(defun num-digit (n)
  (length (write-to-string n)))
 
> (num-digit 1017)
4
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.12.2016, 09:23
Помогаю со студенческими работами здесь

Посчитать количество и сумму десятичных цифр введенного числа
что-то не получается. Прошу помощи.Спасибо. #include&lt;iostream&gt; using namespace std; int main() { setlocale(0,...

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

Вывести количество десятичных цифр, необходимых для представления заданного целого числа
Ввести целое N. Вывести количество десятичных цифр, необходимых для представления этого числа. Добавлено через 23 часа 13 минут ...

Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию
дано целое десятичное число А. Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию ....

Выделение десятичных цифр числа
Пользователь вводит любое целое число 1) посчитать количесвто цифр этого числа (123456 - 6) 2) посчитать сумму цифр этого числа...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru