如何在 Lisp(scheme) 中编写幂函数?我这里的程序有什么问题?
How to write a power function in Lisp(scheme)? What's wrong with my program here?
(define (pow b n)
"YOUR-DOC-HERE"
(cond ((= n 0) 1)
((even? n) (pow (pow b (/ n 2)) 2))
((odd? n) (* b (pow (pow b (/ (- n 1) 2)) 2)))))
(define (pow b n)
"YOUR-DOC-HERE"
(cond ((= n 0) 1)
((even? n) (* (pow b (/ n 2)) (pow b (/ n 2))))
((odd? n) (* b (pow b (/ (- n 1) 2)) (pow b (/ (- n 1) 2))))))
这是我的代码的两个版本,用于具有对数效率的幂函数。但是,第一个函数会出现 maximum recursion depth exceeded
错误,第二个函数虽然有效,但似乎没有达到所需的效率。我是 Scheme 的新手,我想知道这些实现有什么问题?
您的第一个版本使用自身对每个值求平方,这在 even?
子句中创建了一个无限循环。
您的第二个版本在每个子句中调用 pow
两次 ,这会反转对数算法的任何增益。
您可以使用 let
修复它,如下所示:
(define (pow b n)
"Recursive power in logarithmic depth."
(let ((square (lambda (x) (* x x))))
(cond ((= n 0) 1)
((even? n) (square (pow b (/ n 2))))
((odd? n) (* b (square (pow b (/ (- n 1) 2))))))))
或者像这样:
(define (pow b n)
"Recursive power in logarithmic depth."
(cond ((= n 0) 1)
((even? n)
(let ((x (pow b (/ n 2))))
(* x x)))
((odd? n)
(let ((x (square (pow b (/ (- n 1) 2)))))
(* b x x)))))
(define (pow b n)
"YOUR-DOC-HERE"
(cond ((= n 0) 1)
((even? n) (pow (pow b (/ n 2)) 2))
((odd? n) (* b (pow (pow b (/ (- n 1) 2)) 2)))))
(define (pow b n)
"YOUR-DOC-HERE"
(cond ((= n 0) 1)
((even? n) (* (pow b (/ n 2)) (pow b (/ n 2))))
((odd? n) (* b (pow b (/ (- n 1) 2)) (pow b (/ (- n 1) 2))))))
这是我的代码的两个版本,用于具有对数效率的幂函数。但是,第一个函数会出现 maximum recursion depth exceeded
错误,第二个函数虽然有效,但似乎没有达到所需的效率。我是 Scheme 的新手,我想知道这些实现有什么问题?
您的第一个版本使用自身对每个值求平方,这在 even?
子句中创建了一个无限循环。
您的第二个版本在每个子句中调用 pow
两次 ,这会反转对数算法的任何增益。
您可以使用 let
修复它,如下所示:
(define (pow b n)
"Recursive power in logarithmic depth."
(let ((square (lambda (x) (* x x))))
(cond ((= n 0) 1)
((even? n) (square (pow b (/ n 2))))
((odd? n) (* b (square (pow b (/ (- n 1) 2))))))))
或者像这样:
(define (pow b n)
"Recursive power in logarithmic depth."
(cond ((= n 0) 1)
((even? n)
(let ((x (pow b (/ n 2))))
(* x x)))
((odd? n)
(let ((x (square (pow b (/ (- n 1) 2)))))
(* b x x)))))