我被要求編寫一個程序,通過遞歸過程來計算帕斯卡三角形的元素。我可以創建一個過程,返回三角形中的單個行或特定行中的一個數字。有沒有更有效的方法來編寫這個遞歸過程?
這裏是我的解決方案:
(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)
較大行的元素。通過遞歸過程解決這個問題是否有更好的過程?
另外,如果我想使用迭代過程(尾遞歸),我該如何編寫它?
回覆我的編輯,你的代碼可能是與使用更加可讀'cond'而不是嵌套'if's,以及使用命名'let' ins內在的定義但是我僅將修改保留爲僅用於格式化。 – 2014-09-29 16:07:04