LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Мой вариант. Рекурсия вычисляет каждый Pn один раз, а не экспонециально.

Используется стандартная функция iota вместо своего велосипеда.

#lang scheme
(require srfi/1)

(define (Pn x target-n)
  (define (rec Pn-2 Pn-1 n)
    (define Pn (/ (- (* (- (* 2 n) 1) x Pn-1)
                     (* (- n 1) Pn-2))
                  n))
    (if (= target-n n)
        Pn
        (rec Pn-1 Pn (add1 n))))
  (case target-n
    ((0) 1)
    ((1) x)
    (else (rec 1 x 2))))

(define (legendre n)
  (map (lambda (i) (exact->inexact (Pn i n)))
       (iota 21 #e-1 #e0.1)))
(display (legendre 2))

Исходная версия monk, :

Мой вариант. Рекурсия вычисляет каждый Pn один раз, а не экспонециально.

Используется стандартная функция iota вместо своего велосипеда.

#lang scheme
(require srfi/1)

(define (Pn x target-n)
  (define (rec Pn-2 Pn-1 n)
    (define Pn (/ (- (* (- (* 2 n) 1) x Pn-1)
                     (* (- n 1) Pn-2))
                  n))
    (if (= target-n n)
        Pn
        (rec Pn-1 Pn (add1 n))))
  (cond ((= target-n 0) 1)
        ((= target-n 1) x)
        (else (rec 1 x 2))))

(define (legendre n)
  (map (lambda (i) (exact->inexact (Pn i n)))
       (iota 21 #e-1 #e0.1)))
(display (legendre 2))