Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
1

Clojure Определить, факториал какого числа равен передаваемому значению

05.05.2014, 22:13. Просмотров 1294. Ответов 17
Метки нет (Все метки)

Здравствуйте!
Чего-то такого написал:
Lisp
1
2
3
4
(defun foo (n)
       ((setq x 1)
        (setq foo-plus '(if (= x n) x (let (setq n (/ n (setq x (+ x 1)))) (funcall foo-plus)))
        (if (= x n) x (funcall foo-plus)))))
Но оно не работает, так как скорее всего funcall работает совсем не так, как мне думалось.
Помогите написать функцию, а лучше — поправить мою.

Добавлено через 7 минут
Короче, давно ничего не писал на лисп. Вообще бред написал.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2014, 22:13
Ответы с готовыми решениями:

Определить, что старший байт числа равен значению переменной с
Вот такое задание.... Буду рада хотя бы алгоритму выполнения. Дана переменная char c. Напишите...

Факториал некоторого числа равен p. Найти это число
Факториал некоторого числа равен p. Найти это число

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

Факториал некоторого числа равен p. Найти это число (составить диалоговую программу)
1.Факториал некоторого числа равен p. Найти это число: var p,i,s:integer; begin write('Введите...

17
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
05.05.2014, 23:58 2
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> ;racket 
(define (factorial n)
  (let nested ((num n) (acc1 1) (acc2 1))
    (if (= num 0) acc2
        (nested (- num 1) (* acc1 acc2) (* acc2 num)))))
 
 
> (define (is-factorial n)
    (let nested ((start 0))
      (let ((num (factorial start)))
        (cond ((< num n) (nested (+ start 1)))
              ((= num n) start)
              (else #f)))))
> (is-factorial 720)
6
> (is-factorial 721)
#f
>
2
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
06.05.2014, 04:09 3
Clojure:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defn is-fact [n]
  (loop [n n acc 2]
    (cond (zero? n) 1
          (= n 1) (dec acc)
          (or (ratio? n) (neg? n)) "no factorial"
          :else (recur (/ n acc) (inc acc)))))
;; => #'user/is-fact
 
(map is-fact '(0 1 2 6 24 120 720))
;; => (1 1 2 3 4 5 6)
(map is-fact '(14 -120 55))
;; => ("no factorial" "no factorial" "no factorial")
3
defun
602 / 616 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.05.2014, 06:15 4
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
Lisp
1
2
3
4
(defun foo (n)
* * * *((setq x 1)
* * * * (setq foo-plus '(if (= x n) x (let (setq n (/ n (setq x (+ x 1)))) (funcall foo-plus)))
* * * * (if (= x n) x (funcall foo-plus)))))
пиши больше, у тебя хорошо получается...
как успехи с онтологиями?
1
3251 / 2314 / 421
Регистрация: 28.04.2012
Сообщений: 7,708
06.05.2014, 07:05 5
Lisp
1
2
3
4
5
6
7
8
9
(defun is-fact (n)
  (loop
    :for i :upfrom 1
    :and f := 1 :then (* f i)
    :when (= f n) :do (return (1- i))
    :when (> f n) :do (return nil)))
 
(mapcar #'is-fact '(0 1 2 4 6 120 121))
; (NIL 0 2 NIL 3 5 NIL)
3
4464 / 4178 / 350
Регистрация: 12.05.2012
Сообщений: 2,943
06.05.2014, 08:40 6
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun factorial-of (m &optional (n 1) &aux (f (factorial n)))
  (cond ((> f m) nil)
        ((= f m) n)
        (t (factorial-of m (1+ n)))))
 
(defun factorial (n)
  (if (zerop n) 1 (* n (factorial (- n 1)))))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
8
9
10
(defun factorial-of (m &optional (n 1) &aux (f (factorial n)))
  (when (<= f m) (if (= f m) n (factorial-of m (1+ n)))))
 
(defun factorial (n)
  (if (zerop n) 1 (* n (factorial (- n 1)))))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
Добавлено через 35 минут
Lisp
1
2
3
4
5
6
7
8
9
10
(defun factorial-of (m &optional (n 2) &aux (z (/ m n)))
  (cond ((or (= m 2) (= m 1)) m)
        ((= (1+ n) z) z)
        ((< (1+ n) z) (factorial-of Z (1+ n)))
        (t nil)))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
3
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
06.05.2014, 10:03  [ТС] 7
transformator.t, писать больше чтобы такие как Вы ржали с меня? Ну нет. Я буду писать больше просто назло, хоть и не получается=)
Да какие там успехи. С английским все плохо, а литературу на русском не найти.

Добавлено через 1 час 21 минуту
Всем спасибо. Больше всего приглянулось одно из решений _sg, а именно это:
Lisp
1
2
3
4
5
(defun factorial-of (m &optional (n 2) &aux (z (/ m n)))
  (cond ((or (= m 2) (= m 1)) m)
        ((= (1+ n) z) z)
        ((< (1+ n) z) (factorial-of Z (1+ n)))
        (t nil)))
Ибо коротко, одной функцией, достаточно стандартно.

Остальным ответам рад не менее, но clojure и racket для меня еще темнее чем common lisp. Аля-паскаль тоже оценил, но как-то не для эстетики=)
2
defun
602 / 616 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.05.2014, 11:21 8
Mypowerfulbrain, где ты видел смех?
я тебя мотивирую и у меня хорошо получается ->
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
Я буду писать больше
я такой же как и ты, пишу так же, так что не парься)
1
Модератор
Эксперт Python
27988 / 14946 / 2945
Регистрация: 12.02.2012
Сообщений: 24,483
Записей в блоге: 4
06.05.2014, 11:56 9
Или так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun fact-what (n)
  (iter (for i upfrom 1) (let ((c (multiplying i))) 
         (if (= c n) (return i) (when (> c n) (return nil))))))
 
==> fact-what
 
(fact-what 243290200817664000)
 
==> NIL
 
(fact-what 2432902008176640000)
 
==> 20
1
4464 / 4178 / 350
Регистрация: 12.05.2012
Сообщений: 2,943
06.05.2014, 12:34 10
Lisp
1
2
3
4
5
6
7
8
9
10
(defun factorial-of (m &optional (n 2) &aux (z (/ m n)))
  (cond ((= m 1) m)
        ((= z 1) n)
        ((< n z) (factorial-of Z (1+ n)))
        (t nil)))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
Добавлено через 5 минут
Lisp
1
2
3
4
5
6
7
8
9
10
(defun factorial-of (m &optional (n 2) &aux (z (/ m n)))
  (cond ((= m 1) m)
        ((= z 1) n)
        ((< n z) (factorial-of Z (1+ n)))
        (nil)))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
Добавлено через 39 секунд
Lisp
1
2
3
4
5
6
7
8
9
(defun factorial-of (m &optional (n 2) &aux (z (/ m n)))
  (cond ((= m 1) m)
        ((= z 1) n)
        ((< n z) (factorial-of Z (1+ n)))))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
2
Модератор
Эксперт Python
27988 / 14946 / 2945
Регистрация: 12.02.2012
Сообщений: 24,483
Записей в блоге: 4
06.05.2014, 12:37 11
Деление - более медленная операция, чем умножение:

Lisp
1
2
3
4
(defun fact-what (n &optional (p 1) (c 1))
  (cond ((= p n) c)
        ((> p n) nil)
        (t (fact-what n (* p (+ c 1)) (+ c 1)))))
2
4464 / 4178 / 350
Регистрация: 12.05.2012
Сообщений: 2,943
06.05.2014, 13:04 12
Lisp
1
2
3
4
5
6
7
(defun factorial-of (m &optional (z 1) (n 1))
  (when (<= z m) (if (= z m) n (factorial-of m (* z (1+ n)) (1+ n)))))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
(defun factorial-of (m &optional (z 1) (n 1))
  (unless (> z m) (if (= z m) n (factorial-of m (* z (1+ n)) (1+ n)))))
 
> (factorial-of 479001600)
12
> (factorial-of 479001601)
NIL
3
3251 / 2314 / 421
Регистрация: 28.04.2012
Сообщений: 7,708
06.05.2014, 13:28 13
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
Аля-паскаль
Где ты это увидел?
0
Модератор
Эксперт Python
27988 / 14946 / 2945
Регистрация: 12.02.2012
Сообщений: 24,483
Записей в блоге: 4
06.05.2014, 14:31 14
Вот не Паскаль, а скорее Бэйсик. Но работает:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun fact-what (n)
  (prog (i f)
    (setq i 1 f 1)
 Beg
    (when (= f n) (return i))
    (when (> f n) (return nil))
    (setq i (+ i 1))
    (setq f (* f i))
    (go Beg)))
 
==> fact-what
 
(factorial-of 479001600)
 
==> 12
2
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
06.05.2014, 15:13 15
Смотрю я на свое решение и думаю, что с "(zero? n) 1" - я погорячился
Исправленный вариант:
Lisp
1
2
3
4
5
6
7
8
9
10
(defn is-fact [n]
  (loop [n n acc 2]
    (if (= n 1)
      (dec acc)
      (when-not (or (zero? n) (ratio? n))
        (recur (/ n acc) (inc acc))))))
;; => #'user/is-fact
 
(map is-fact '(0 1 2 6 24 120 720 15 -120))
;; => (nil 1 2 3 4 5 6 nil nil)
2
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
06.05.2014, 15:34 16
Lisp
1
2
3
4
;racket
(define (fact-of n)
  (do ((i 1 (+ i 1)) (acc 1 (* acc i)) (res #f (= n acc)))
    ((> acc n) (if (eq? res #t) (- i 2) #f))))
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
06.05.2014, 15:56  [ТС] 17
korvin_, интересно то, что именно вы отреагировали. Я про это решение:
Lisp
1
2
3
4
5
6
7
8
9
(defun is-fact (n)
  (loop
    :for i :upfrom 1
    :and f := 1 :then (* f i)
    :when (= f n) :do (return (1- i))
    :when (> f n) :do (return nil)))
 
(mapcar #'is-fact '(0 1 2 4 6 120 121))
; (NIL 0 2 NIL 3 5 NIL)
Сейчас вы мне расскажите почему Я не прав, а скорее всего это так.
0
3251 / 2314 / 421
Регистрация: 28.04.2012
Сообщений: 7,708
06.05.2014, 16:35 18
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
Сейчас вы мне расскажите почему Я не прав, а скорее всего это так.
Да, ты не прав. Это вполне «Lisp-way» — написание мини-eDSL под задачу. Разве что скобочек маловато, но, например, iter из нестандартного пакета iterate более лисповый.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2014, 16:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Составить процедуру, проверяющую равен ли номер билета квадрату какого-либо натурального числа;
Составить процедуру, проверяющую равен ли номер билета квадрату какого-либо натурального числа;...

Определить номера строк матрицы, в которых хотя бы один элемент равен заданному значению
Определить номер строки матрицы R,хотя бы один элемент которых равен С, и элементы этих строк...

Определить номера строк матрицы, хотя бы один элемент которых равен заданному значению
4. Определить номера строк матрицы R, хотя бы один элемент которых равен с, и элементы этих строк...

Для заданного натурального числа N определить, у какого числа больше делителей
begin write('Введите N:');readln(n); for i:=1 to n do begin kk:=0; for j:=2...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.