Functional programming 从列表中添加数字(例如,asdf125dkf将返回8)
我需要一个函数,它将接收字符和数字的列表,然后返回相加的数字(忽略字符)。这就是我到目前为止所做的:Functional programming 从列表中添加数字(例如,asdf125dkf将返回8),functional-programming,lisp,scheme,Functional Programming,Lisp,Scheme,我需要一个函数,它将接收字符和数字的列表,然后返回相加的数字(忽略字符)。这就是我到目前为止所做的: (define (adder lst) (cond ((null? lst) 0) ((number? (car lst)) (+(adder (car lst)) (adder (cdr lst)))) ((char? (car lst)) ((adder(cdr lst)))) )) (display (a
(define (adder lst)
(cond
((null? lst)
0)
((number? (car lst))
(+(adder (car lst)) (adder (cdr lst))))
((char? (car lst))
((adder(cdr lst))))
))
(display (adder '(asd12sdf)))
在codepad.org上运行它只会显示void。我知道代码是错误的,因为它看起来是错误的,但我不知道如何修复它。。。如何让函数跟踪它找到的第一个数字并将其添加到它找到的下一个数字,同时跳过所有字符?在第二种情况下,没有理由在
(car lst)
上运行加法器。只需将(汽车列表)
本身添加到递归步骤就可以了
对于最后一行,不要测试(char?(car lst))
。只需将最后一行设为else
子句,这意味着除数字以外的任何内容都将转到else行
您获得void的原因是您的输入不满足任何cond
条件,并且您没有其他
,因此答案为nothing(即(void)
)
最后一个错误是你给它的输入'(asd12sdf)
是一个带有一个名为“asd12sdf”符号的列表。我想你应该给它一个由6个符号和2个数字组成的列表,结果应该是3。请注意,符号'a
和字符\a
之间有一个非常重要的区别
看起来您已经搞定了逻辑,所以您的问题似乎不是函数式语言,而是Scheme的语法
编辑:在最后一行,您有((加法器(cdrlst))
,它有一个太多的参数。这将导致Scheme尝试将加法器的结果(这是一个数字)作为一个过程(错误!)进行评估。您应该注意,此函数或多或少是求和
,只需使用折叠
即可定义
(define (adder lst)
(fold + 0 lst))
折叠做什么?基本上,它的定义如下:
(define (fold f initial lst)
(if (null? lst)
initial
(fold f (f (car lst) initial) (cdr lst))))
(换句话说,它在lst的每个元素上调用f,一个由2个参数组成的函数,使用lst的car作为第一个参数,将累积结果作为f的第二个参数。)
这里您需要解决的问题是+不知道如何对非数值进行操作。没问题,你已经处理好了。如果它是一个角色,会发生什么?好吧,您没有向总值中添加任何内容,所以将其替换为0。因此,您的解决方案非常简单:
(define (adder lst)
(fold your-new-protected-+ 0 lst))
在公共Lisp中:
(reduce #'+ '(1 #\a #\b 2 1 2 #\c #\d 4)
:key (lambda (item) (if (numberp item) item 0)))
或
+1作为示范作业问题。
(loop for item in '(1 #\a #\b 2 1 2 #\c #\d 4)
when (numberp item) sum item)