Мне было предложено написать процедуру, которая вычисляет элементы треугольника Паскаля с помощью рекурсивного процесса. Я могу создать процедуру, которая возвращает одну строку в треугольнике или число в определенной строке.Есть ли более эффективный способ написать этот рекурсивный процесс?
Вот мое решение:
(define (f n)
(cond ((= n 1) '(1))
(else
(define (func i n l)
(if (> i n)
l
(func (+ i 1) n (cons (+ (convert (find (- i 1) (f (- n 1))))
(convert (find i (f (- n 1)))))
l))))
(func 1 n '()))))
(define (find n l)
(define (find i n a)
(if (or (null? a) (<= n 0))
'()
(if (>= i n)
(car a)
(find (+ i 1) n (cdr a)))))
(find 1 n l))
(define (convert l)
(if (null? l)
0
(+ l 0)))
Это, кажется, работает хорошо, но это становится действительно неэффективно, чтобы найти элементы большей строки, начиная с (f 8)
. Есть ли более эффективная процедура, которая решает эту проблему с помощью рекурсивного процесса?
Также, как бы я его написал, если я хочу использовать итеративный процесс (хвостовая рекурсия)?
Re моих правок, ваш код может быть еще более удобным для чтения с использованием 'cond' вместо вложенных' if '' и использование имен 'let' ins чаи внутренних определений. Но я сохранил свои изменения исключительно для форматирования. –