为什么我编写的Scheme统计列表元素的numofatoms函数没有输出?
问题原因分析
- 核心问题是括号不匹配:你最后一行函数调用的代码缺少2个闭合右括号,Scheme解释器会一直等待你输入完整的表达式,因此不会产生任何输出,看起来就是程序卡住无响应。
原错误调用代码:(numofatoms '((1 3) 7 (4(5 2))); calling the function
修正后正确的调用代码:(numofatoms '((1 3) 7 (4 (5 2)))) - 次要问题是函数名一致性:你需求举例的调用函数名为
numOfSymbols,但实际定义的函数名为numofatoms,Scheme区分大小写,如果按照示例的函数名调用会报未定义错误,保持调用和定义的函数名一致即可。
修正后的完整可运行代码
; 统计嵌套列表中原子的总数量 (define (numofatoms lst) ; 定义辅助展平函数 (define (flatten x) (cond ((null? x) '()) ((pair? x) (append (flatten (car x)) (flatten (cdr x)))) (else (list x)))) (length (flatten lst))) ; 调用测试,返回6 (numofatoms '((1 3) 7 (4 (5 2))))
可选优化方案
你不需要额外定义展平函数,可以直接递归统计,减少不必要的内存开销,代码示例如下:
(define (numofatoms lst) (cond ((null? lst) 0) ((pair? (car lst)) (+ (numofatoms (car lst)) (numofatoms (cdr lst)))) (else (+ 1 (numofatoms (cdr lst))))))
内容的提问来源于stack exchange,提问作者RoboC
相关产品推荐
相关产品推荐

