学习SICP时用product函数实现阶乘遇‘1 is not a function’错误求助
解决SICP中product函数定义阶乘的报错问题
你的代码里有两个关键错误导致了报错,逐一修正就能解决:
1. identity函数定义错误
你写的(define (identity h) (h))是把参数h当作函数来调用,但h是数字(比如1、2这些阶乘里的整数),调用数字自然会报“1 is not a function”的错误。正确的identity函数应该直接返回传入的参数:
(define (identity h) h)
2. product函数的迭代逻辑错误
乘积的迭代逻辑和求和完全不同,你的代码误用了求和的写法:
- 初始值错误:乘积的初始值应该是1(乘法的单位元,任何数乘1都不变),而不是0(0乘任何数都是0,会直接导致结果错误)。
- 迭代更新错误:每次迭代应该用当前结果乘以
(term a),而不是相加。你写的(+ result (term a))是求和逻辑,改成乘法即可。
修正后的完整代码:
(define (product term a next b) (define (iter result a) (if (> a b) result (* (term a) (iter (* result (term a)) (next a))))) (iter 1 a)) ; 初始值改为1 (define (factorial x) (define (inc h) (+ h 1)) (define (identity h) h) ; 修正identity函数 (product identity 1 inc x)) (factorial 4) ; 运行结果为24,符合预期
内容的提问来源于stack exchange,提问作者George Wu
相关产品推荐
相关产品推荐

