Здравствуйте, делал математические вычисления на scheme. И у меня возникла потребность вывести результаты вычисления в виде списка, на чем я собственно и застрял.
Задание: Вычислить и представить в виде списка полином Лежандра Pk: P0 = 1, P1 = x, Pn+1 = ((2n + 1)xPn − nPn−1)/(n + 1).
Я переделал формулу для просто Pn-ого члена для удобства вычисления. Pn = ((2n-1)*x*P[n-1] - (n-1)*P[n-2])/(n). Формула в виде картинки, Pn-ого члена, которая получилась
Код который у меня получился правильно находит значения полинома.
Вот код, который получился до того как я пытался вывести результаты вычисления в список.
#lang scheme
(define (P0 n)
1
)
(define (P1 x)
x
)
(define (Pn x n)
(if (= n 0)
(P0 x)
(if (= n 1)
(P1 x)
(/ (- (* (- (* 2 n) 1) x (Pn x (- n 1))) (* (- n 1) (Pn x (- n 2)))) n)
)
)
)
;(lambda (x n) (/ (- (* (- (* 2 n) 1) x (Pn x (- n 1))) (* (- n 1) (Pn x (- n 2)))) n))
(define (legendre n)
(do ((i #e-1
(+ i #e0.1)
))
((= i #e1) i)
(println (exact->inexact (Pn i n)))
)
)
(legendre 2)
А вот костыльный код, в котором я вывожу результаты вычисления в список.
#lang scheme
(define (P0 n)
1
)
(define (P1 x)
x
)
(define (Pn x n)
(if (= n 0)
(P0 x)
(if (= n 1)
(P1 x)
(/ (- (* (- (* 2 n) 1) x (Pn x (- n 1))) (* (- n 1) (Pn x (- n 2)))) n)
)
)
)
(define (P0lst n)
'(1)
)
(define (P1lst x)
(append (P0lst x) (list x))
)
(define (Pnlst x n)
(if (= n 0)
(P0lst x)
(if (= n 1)
(P1lst x)
(/ (- (* (- (* 2 n) 1) x (Pn x (- n 1))) (* (- n 1) (Pn x (- n 2)))) n)
)
)
)
(define resLst (list))
(define add
(let ((the-list resLst))
(lambda (new-item)
(set! resLst
(cons new-item resLst))
the-list)))
(define (legendre n)
(do ((i #e-1
(+ i #e0.1)
))
((= i #e1) i)
(add (exact->inexact (Pnlst i n)))
)
)
(legendre 2)
resLst
В связи с плохими знаниями функционального программирования и scheme в частности, у меня возник вопрос, а можно ли найти способ более элегантно занести результаты в список?