Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
8 / 6 / 2
Регистрация: 29.11.2017
Сообщений: 206
1

Перевести код функции SquareDigitsSum (Haskell -> Lisp)

23.11.2018, 20:12. Показов 828. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Никак не получается переписать функцию SquareDigitsSum с Haskell на Lisp(
На Haskell функция рабочая


Вот что получилось:
Haskell
1
2
3
4
5
squareDigitsSum y = y : (squareDigitsSum z)
                where z = dopFunction (y * y)
dopFunction x = if (x < 10) 
                then x 
                else (x `mod` 10) + dopFunction (x `div` 10)
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(defun dopFunction (x)
  (if (< x 10)
      x
      (+ (mod x 10) (dopFunction (floor x 10)))))
 
(print (dopFunction 5))
(print (dopFunction 15))
(print (dopFunction 125))
 
(defun zeshka (y)
    (dopFunction (* y y)))
 
(print (zeshka 50))
 
(defun squareDigitsSum2 (y)
    (squareDigitsSum2 y) (zeshka y))
 
 (defun squareDigitsSum (y)
   (cons y (squareDigitsSum2 y)))
 
 (print (squareDigitsSum 100))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2018, 20:12
Ответы с готовыми решениями:

Переписать код с Haskell на Lisp
Необходимо переписать имеющийся код на Haskell'е на Lisp. Помогите пожалуйста! codeEvRod n |...

Решил перевести код с Pascal на Lisp. Алгоритм подсчета счастливых билетов
Автобусные билеты нумеруются шестизначными числами от 000000 до 999999. Напишите программу, которая...

Совместимость Lisp и Haskell с С++
Привет всем. Известно что языки Hasskel и Lisp на сегодня не так популярны как С++ или PHP....

Помогите перевести с Haskell на другой язык
День добрый, Если не сложно, помогите перевести данный codegolf код на любой другой язык...

5
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
23.11.2018, 22:41 2
Вижу проблему в именовании функций. На лиспе не пишут dopFunction, пишут dop-function. Вместо where используйте let. Вместо отдельного вычисления mod и div я бы использовал оба значения, которые возвращает floor.

Странная рекурсия, даже не хвостовая. Может, её можно циклом заменить?

Что функция должна делать — непонятно, и в чём ваша проблема — тоже непоняно.
1
8 / 6 / 2
Регистрация: 29.11.2017
Сообщений: 206
23.11.2018, 22:47  [ТС] 3
Мне надо код с Haskell перевести на язык Lisp
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
23.11.2018, 23:12 4
Lisp
1
2
3
4
5
6
7
8
9
(defun square-digits-sum  (n)
  (reduce #'+ (int-digits (* n n))))
 
(defun int-digits (n &optional ac)
  (if (zerop n) ac
      (int-digits (truncate n 10) (cons (rem n 10) ac))))
 
> (square-digits-sum 5)
7
Определить функцию, возвращающую сумму цифр квадрата заданного целого числа.
1
8 / 6 / 2
Регистрация: 29.11.2017
Сообщений: 206
23.11.2018, 23:26  [ТС] 5
Работа программы то правильная,но я должен получать список
take и drop я описал,но всё также не работает:


Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun drop (n stream)
  (if (= n 0) stream
      (drop (- n 1) (tail stream))))
 ; заводим вспомогательную функцию take, которая берет из потока первые n 
 ; элементов
(defun take (n stream)
  (if (= n 0) *the-empty-stream*
      (cons (head stream) (take (- n 1) (tail stream)))))
 
(defun int-digits (n &optional ac)
  (if (zerop n) ac
      (int-digits (truncate n 10) (cons (rem n 10) ac))))
 
(defun square-digits-sum  (n)
  (reduce #'+ (int-digits (* n n))))
 
(print (take 5 (square-digits-sum 200)))
(print (take 10 (square-digits-sum 136)))
(print (take 3 (square-digits-sum 155)))
Лучше даже так скинуть

Добавлено через 26 секунд

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
(defmacro delay (expr)
  `(cons NIL (lambda () ,expr)))
 
;; функция вычисления обещания  
(defun force (delay)
  (if (car delay) 
      (cdr delay)
      (progn (setf (car delay) T)
             (setf (cdr delay) (funcall (cdr delay))))))
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; макрос для создания потока из головы a и хвоста str
;; результат вычисления str - поток
(defmacro cons-stream (a str)
  `(cons ,a (delay ,str)))      
 
;; функция извлечения головы потока (вместо car-stream)
(defun head (stream)
  (car stream))
 
;; функция извлечения хвоста потока (вместо cdr-stream)
(defun tail (stream)
  (force (cdr stream)))
 
;; функция проверки потока на пустоту
(defun empty-stream-p (stream)
  (null stream))  
 
;; определение глобальной переменной - пустой поток
(defvar *the-empty-stream* '())  
 
;; функция фильтрации потока stream с помощью предиката p
(defun filter-stream (p stream)
  (cond ((empty-stream-p stream) *the-empty-stream*)
        ((funcall p (head stream)) 
         (cons-stream (head stream) 
                      (filter-stream p (tail stream))))
        (T (filter-stream p (tail stream)))))
 
(defun drop (n stream)
  (if (= n 0) stream
      (drop (- n 1) (tail stream))))
 ; заводим вспомогательную функцию take, которая берет из потока первые n 
 ; элементов
(defun take (n stream)
  (if (= n 0) *the-empty-stream*
      (cons (head stream) (take (- n 1) (tail stream)))))
 
(defvar *ones*) ; объявление переменной
(setq *ones* (cons-stream 1 *ones*)) 
 
;; функция, выдающая поток целых чисел, начинающийся с n
(defun integers-starting-from (n)
  (cons-stream n (integers-starting-from (+ n 1))))
  
;; функция, получающая поток простых чисел из потока stream при условии,
;; что stream - возрастающая последовательность целых чисел в которой
;; головной элемент - простое число и в stream нет чисел, у которых
;; делителями являются числа меньшие головного элемента (кроме единицы).
(defun sieve (stream)
  (cons-stream
    (head stream)
    (sieve 
      (filter-stream
        (lambda (x) (not (divisible-p x (head stream))))
        (tail stream)))))
 
(defun int-digits (n &optional ac)
  (if (zerop n) ac
      (int-digits (truncate n 10) (cons (rem n 10) ac))))
 
(defun square-digits-sum  (n)
  (reduce #'+ (int-digits (* n n))))
 
(print (take 5 (square-digits-sum 200)))
(print (take 10 (square-digits-sum 136)))
(print (take 3 (square-digits-sum 155)))
Лучше даже так скинуть
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37302 / 20736 / 4272
Регистрация: 12.02.2012
Сообщений: 34,127
Записей в блоге: 14
24.11.2018, 11:22 6
Загляни Функция square-digits-sum
0
24.11.2018, 11:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2018, 11:22
Помогаю со студенческими работами здесь

Перевести код из функции в шаблоны функции
Короче, у меня есть прога написанная с помощью функций, теперь мне нужно написать её с помощью...

Перевести код математической функции с паскаля
Здравствуйте, есть функция написана в паскале: function g (a,b :real) : real begin ...

Перевести код математической функции с паскаля В C++ Builder
Есть программа в паскале нужно переделать в С++ Builder, помогите, заранее спасибо. var a :...

Перевести пример на язык LISP
Помогите перевести пример на язык LISP

Функция squareDigitsSum
squareDigitsSum :: Integral a =&gt; a -&gt; ,определяющую для заданного целого x последовательность ,где...

Как перевести из Lisp на Prolog или решение задач
Всем добрый вечер. К сожалению, в Prolog не работал, нужно перевести из Lisp в Prolog, либо сделать...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru