从列表中添加数字(例如,asdf125dkf将返回8)

从列表中添加数字(例如,asdf125dkf将返回8)

问题描述:

我需要一个函数,它将采用一个字符和数字列表,然后返回加起来的数字(忽略字符)。这是我到目前为止:从列表中添加数字(例如,asdf125dkf将返回8)

(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。我知道代码是错误的,因为它看起来不对,但我不知道如何修复它...我如何让函数追踪它找到的第一个数字并将其添加到它找到的下一个数字,同时跳过所有数字字符?

+0

+1作为模型的家庭作业的问题。 – nmichaels 2010-11-04 01:53:37

在你的第二个cond案例中,没有理由在(car lst)上运行adder。只需将(car list)本身添加到递归步骤即可。

对于最后一行,请不要测试(char? (car lst))。只要最后一行是else条款,意思是任何东西,但是一个数字将会到else行。

你得到无效的原因是因为你的输入不满足cond条件的任何,你有没有else,所以答案是什么(即(void))。

最后一个错误是您输入的内容。 '(asd12sdf)实际上是一个名为“asd12sdf”的一个符号的列表。我想你想给它'(a s d 1 2 s d f)(6个符号和2个数字的列表),应该导致3.请注意,符号'a和字符#\a之间有一个非常重要的区别。

它看起来像你有逻辑下来,所以你的问题似乎不是功能语言,只是Scheme的语法。

编辑:并在最后一行,你有((adder(cdr lst)))有一个太多的parens缠绕它。这将导致Scheme尝试将加法器(这是一个数字)的结果作为过程(错误!)进行评估。

您应该注意到,该功能或多或少可以通过fold简单定义sum

(define (adder lst) 
    (fold + 0 lst)) 

fold做什么?基本上,它是定义像这样:

(define (fold f initial lst) 
    (if (null? lst) 
    initial 
    (fold f (f (car lst) initial) (cdr lst)))) 

(换言之,它调用f,的2个参数的函数,LST中的每个元素,使用LST作为第一个参数的轿厢,并且累加结果作为f的第二个参数)

您需要解决的问题是+不知道如何操作非数字值。没问题,你已经处理了。如果它是一个角色会发生什么?那么,你没有添加任何东西的总价值,所以取而代之的是0。因此,您的解决方案很简单,只要:

(define (adder lst) 
    (fold your-new-protected-+ 0 lst)) 

Common Lisp中:

(reduce #'+ '(1 #\a #\b 2 1 2 #\C#\d 4) 
     :key (lambda (item) (if (numberp item) item 0))) 

(loop for item in '(1 #\a #\b 2 1 2 #\C#\d 4) 
     when (numberp item) sum item)