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

Вычислить (1+x/(2+x/(3+x(./(n+x).)

07.10.2021, 21:41. Показов 1088. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вычислить (1+x/(2+x/(3+x(.../(n+x)...)))
Lisp
1
2
3
4
5
#lang racket
(define n 0)
(define (f (x n))
(/(+ n x) (+(+ n 1) x))
)
данный код требует цикл, но все попытки реализации проваливаются
P.S. я новичок и до конца не могу понять специфику данного языка на данном этапе. Помогите.
0
Лучшие ответы (1)
Автор канал по Лиспу
24 / 22 / 2
Регистрация: 10.08.2021
Сообщений: 357
07.10.2021, 23:02 2
Moonissia, Вам нужно конкретно на Racket? Примут ли Common Lisp?

Давайте рассмотрим пример попроще. Что делает цикл? Он выполняет некое действие, и в зависимости от того, выполняется заданное условие или нет, либо снова производит это действие (причём часто бывает, что с небольшим отличием), либо прекращает.
А чем можно представить это однообразное действие? Конечно функцией! Как нам реализовать повторение? Просто функция должна вызвать сама себя! А если нам нужно передать следующему вызову некоторый дополнительный параметр? Просто вызывайте не эту же самую функцию, а подобную с дополнительным(и) аргументом(и), специально написанную для многократного вызова. Она и будет вызывать сама себя.
Присмотритесь к формуле! Что мы можем вычислить сразу, не выполняя ни одной итерации? Отметьте, из каких похожих частей состоит формула? Как нужно изменить некоторые параметры, чтобы получить следующую часть?
Я дал вам некоторые подсказки, а вы посидите спокойно подумайте, ни на что не отвлекаясь, и попробуйте написать код. Будет непонятно, задавайте дополнительные вопросы.

Обращаясь к остальным Лисперам: пожалуйста, дайте человеку решит задачу самому, прошу, не давайте ему готового решения, но направьте к нему. Благодарю.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.10.2021, 10:04 3
Это цепная дробь, как я понимаю?
Цитата Сообщение от Regrin1 Посмотреть сообщение
пожалуйста, дайте человеку решит задачу самому
-
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
08.10.2021, 10:15 4
сам он ее не решит
1
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 11
08.10.2021, 10:49  [ТС] 5
у меня серьезные проблемы с использованием циклов
хочу использовать while, но он не работает, for вообще непонятный по синтаксису, может есть и другой вариант в данном языке, который можно использовать, но от примеров гугла легче не стало.... Подскажите, пожалуйста, что в данном случае можно использовать для вызова функции n раз?
0
202 / 197 / 8
Регистрация: 09.06.2019
Сообщений: 230
08.10.2021, 11:16 6
Moonissia, самый естественный путь это рекурсия.

Добавлено через 20 минут
вот пример рекурсии
Lisp
1
2
3
4
5
6
(define (my-len lst)
  (if (null? lst)
      0
      (+ 1 (my-len (rest lst)))))
 
;;(my-len '(1 2 3 4)); 4
функция определяет длину списка.
пустой список в параметрах функции завершает рекурсивный цикл, с результатом 0(называется базовый случай)
параметр рекурсивного вызова-итерации (rest lst) определяет шаг рекурсивного цикла.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.10.2021, 11:49 7
Цитата Сообщение от Moonissia Посмотреть сообщение
может есть и другой вариант в данном языке,
- да, например dotimes (CL)

Lisp
1
2
3
4
5
6
7
8
9
10
11
(dotimes (i 6 'ok)
  (printline i))
 
0
1
2
3
4
5
 
==> OK
0
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 11
09.10.2021, 15:16  [ТС] 8
Сдаюсь... Рекурсия не работает так, как задумано. И вообще выполняет действия как-то странно...
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define (n1 x i)
(ds x 0.0 i 0.0)
)
(define (ds x i res n)
(if (> n i)
res
(ds x
i
(/(+ n x) (+ (+ n 1) x))
(+ n 1)
)
)
(n1 10.0 6.0)
)
0
155 / 135 / 9
Регистрация: 21.10.2012
Сообщений: 413
09.10.2021, 15:42 9
Цитата Сообщение от Moonissia Посмотреть сообщение
действия как-то странно...
Я вообще формулу не понял до конца.

К примеру
x = 1
i = 3

Тогда формула разворачивается в (1+1/(2+1/(3+1)))

Это так верно?
0
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 11
09.10.2021, 15:48  [ТС] 10
да, по идее оно должно работать именно так, но в итоге получается, что срабатывает алгоритм только раз (не совсем понятно почему). Но еще более удивительно то, что если значение i менять, то и результат меняется, хотя сама формула от него не зависит....
0
Автор канал по Лиспу
24 / 22 / 2
Регистрация: 10.08.2021
Сообщений: 357
09.10.2021, 17:08 11
Лучший ответ Сообщение было отмечено Moonissia как решение

Решение

Moonissia, Уже лучше! Только следите за отступами. А лучше поставьте себе EMACS или сам Racket, чтобы он расставлял отступы за вас. Без них читать код на Лиспе нормально не получится. Я бы кстати советовал вам поменять местами определения функций, да и со скобками там невесть что. Потому наверное и не работает. Исправил:
Lisp
1
2
3
4
5
6
7
8
9
10
11
#lang racket
 
(define (ds x i res n)
  (if (> n i)
      res
      (ds x i (/(+ n x) (+ (+ n 1) x)) (+ n 1))))
 
(define (n1 x i)
  (ds x 0.0 i 0.0))
 
(n1 10.0 6.0)
Ещё вам может ОЧЕНЬ пригодиться прочесть книгу "Структура и интерпретация компьютерных программ". Там как раз примеры даются на Схеме, а Рэкет от неё произошёл.

Добавлено через 1 час 2 минуты
Moonissia, Начала ли работать программа?

Не по теме:

Для того, чтобы ответить конкретному пользователю, необходимо нажать на его ник, тогда ему придёт уведомление

1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
09.10.2021, 17:17 12
Цитата Сообщение от Regrin1 Посмотреть сообщение
прочесть книгу "Структура и интерпретация компьютерных программ"
- это серьезная книга. Чтение нелегкое...
0
Автор канал по Лиспу
24 / 22 / 2
Регистрация: 10.08.2021
Сообщений: 357
09.10.2021, 17:24 13
Catstail, Ну, думаю даже поверхностное ознакомление может принести пользу.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
09.10.2021, 17:46 14
Regrin1, да, конечно...

Вот мое решение (CL):

Lisp
1
2
3
4
5
6
7
8
(defun chain-fract (x n &optional (acc x))
  (if (= n 1) (+ 1 acc)
      (chain-fract x (- n 1) (/ x (+ n acc))))) 
 
==> CHAIN-FRACT
 
(chain-fract 1 3)
==> 13/9
Схема:

Lisp
1
2
3
4
5
(define (chain-fract x n acc)
  (if (= n 1) (+ 1 acc)
      (chain-fract x (- n 1) (/ x (+ n acc)))))
     
(print (chain-fract 1 3 1))
3
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
09.10.2021, 19:02 15
вот тут как раз бы лямбда и пригодилась, а не тошто там
0
202 / 197 / 8
Регистрация: 09.06.2019
Сообщений: 230
09.10.2021, 20:15 16
я приведу свое решение на ракете, три функции, первая считает, вторая генерирует префиксную мат. формул, третья инфиксную, сгенерированную формулу второй функцией можно вновь подать на вход ракету, и получить уже числовой ответ.
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
;; вычислить: (1+x/(2+x/(3+x/(...x/(n+x)...)))
(define (chain-frac x n)
  (letrec ([ch-frac-loc (lambda (i frac)
                           (if (zero? i)
                               frac
                               (ch-frac-loc (- i 1)
                                            (+ i (/ x frac)))))])
    (ch-frac-loc (- n 1) (+ x n))))
 
;;(chain-frac 1 3) ; 13/9
;;(chain-frac 1 4) ;  53/37
;;(chain-frac 1 5) ;  268/187
 
(define (chain-frac-f x n)
  (letrec ([ch-frac-loc (lambda (i frac)
                           (if (zero? i)
                               frac
                               (ch-frac-loc (- i 1)
                                            `(+ ,i (/ ,x ,frac)))))])
    (ch-frac-loc (- n 1) `(+ ,x  ,n))))
 
;;(chain-frac-f 1 3) ;(+ 1 (/ 1 (+ 2 (/ 1 (+ 1 3))))); 13/9
;;(chain-frac-f 1 4) ;(+ 1 (/ 1 (+ 2 (/ 1 (+ 3 (/ 1 (+ 1 4))))))); 53/37
;;(chain-frac-f 1 5) ;(+ 1 (/ 1 (+ 2 (/ 1 (+ 3 (/ 1 (+ 4 (/ 1 (+ 1 5))))))))); 268/187
 
(define (chain-frac-i x n)
  (letrec ([ch-frac-loc (lambda (i frac)
                           (if (zero? i)
                               frac
                               (ch-frac-loc (- i 1)
                                            `(,i + (,x / ,frac)))))])
    (ch-frac-loc (- n 1) `(,x + ,n))))
 
;;(chain-frac-i 1 3) ; (1 + (1 / (2 + (1 / (1 + 3)))))
;;(chain-frac-i 1 4) ; (1 + (1 / (2 + (1 / (3 + (1 / (1 + 4)))))))
;;(chain-frac-i 1 5) ; (1 + (1 / (2 + (1 / (3 + (1 / (4 + (1 / (1 + 5)))))))))
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
10.10.2021, 14:53 17
Построение выражений:

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
;; Префиксная форма
 
(defun chain-fract (x n &optional (acc 'x))
   (if (= n 1) (list '+ 1 acc)
       (let ((nn (- n 1))
             (zz `(/ ,x (+ ,n ,acc))))
         (chain-fract x nn zz))))
 
;; Вызов
 
(chain-fract 'x 20)
 
==> (+ 1 (/ X (+ 2 (/ X (+ 3 (/ X (+ 4 (/ X (+ 5 (/ X (+ 6 (/ X (+ 7 (/ X (+ 8 (/ X (+ 9 (/ X (+ 10 (/ X (+ 11 (/ X (+ 12 (/ X (+ 13 (/ X (+ 14 (/ X (+ 15 (/ X (+ 16 (/ X (+ 17 (/ X (+ 18 (/ X (+ 19 (/ X (+ 20 X)))))))))))))))))))))))))))))))))))))))
 
 
;; Инфиксная форма
 
(defun chain-fract (x n &optional (acc 'x))
   (if (= n 1) (list 1 '+ acc)
       (let ((nn (- n 1))
             (zz `(,x / (,n + ,acc))))
         (chain-fract x nn zz))))
 
;; Вызов
 
(chain-fract 'x 20)
 
==> (1 + (X / (2 + (X / (3 + (X / (4 + (X / (5 + (X / (6 + (X / (7 + (X / (8 + (X / (9 + (X / (10 + (X / (11 + (X / (12 + (X / (13 + (X / (14 + (X / (15 + (X / (16 + (X / (17 + (X / (18 + (X / (19 + (X / (20 + X)))))))))))))))))))))))))))))))))))))))
2
155 / 135 / 9
Регистрация: 21.10.2012
Сообщений: 413
10.10.2021, 21:54 18
Цитата Сообщение от Moonissia Посмотреть сообщение
у меня серьезные проблемы с использованием циклов
Я раньше кодил на Си.
В rakcet на макросе можно использовать такой цикл
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
;; for-loop -  for В стиле Си
(define-syntax-rule (for-loop [sym init check change] steps ...)
  (let loop ([sym init]
             [value #f])
    (if check
        (let ([new-value (let () steps ...)])
          (loop change new-value))
        value)))
 
; тест
(for-loop [i 0 , (< i 10) , (inc i)]
   (println i))
Не по вопросу:
Если изучаете racket,
имеет смысл поставить среду drRacket - отличная к документация в наличии.

https://racket-lang.org
1
10.10.2021, 21:54
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru