我试图做一个递归函数,它获取一个string-int对列表+一个名为prefix的字符串,并使用名为&#34的函数; starts-with"它总结了begininng匹配前缀的所有int。 问题是,我永远无法让列表继续前进,它在开始时卡住,然后程序崩溃。
(define (sum-of-pairs-start-with prefix ls)
( let*( (prefix2 (string->list prefix))
(str2 (string->list (car (car ls)))))
(cond((null? str2) 0)
( (starts-with prefix (car(car ls)))
(+ cdr(car ls) (sum-of-pairs-start-with prefix (cdr ls))) )
(else sum-of-pairs-start-with prefix (cdr ls))) ) )
我使用输入:
(sum-of-pairs-start-with "a" (list (cons "a" 1) (cons "b" 2) (cons "aa" 33) (cons "ca" 4))) ;; =34
但是一旦我到达列表中的第二对(" b" 2),它会按预期进入else条件,但是然后ls返回一行到原点(使用前一个值)而不是前进到下一个值(" aa" 33)。 我是计划的新手,我不明白为什么会这样,令人沮丧
答案 0 :(得分:2)
您只需调用我们之前定义的starts-with
过程(让它将字符串转换为char列表),并修复所有语法问题:
(define (sum-of-pairs-start-with prefix ls)
(cond ((null? ls) 0)
((starts-with prefix (car (car ls)))
(+ (cdr (car ls)) (sum-of-pairs-start-with prefix (cdr ls))))
(else (sum-of-pairs-start-with prefix (cdr ls)))))
再次,您在调用程序时遇到问题。例如,这些片段是错误的:
cdr(car ls)
(else sum-of-pairs-start-with prefix (cdr ls))
请抓一本关于Scheme的书并练习基本语法,记住 not 这样的程序是这样的:f(x)
,正确的方法是(f x)
。另外,请注意缩进代码的正确方法,如果遵循约定,则更容易找到错误。
答案 1 :(得分:0)
以下是使用更高功能的解决方案:
(define (sum-of-pairs-start-with prefix ls)
(apply +
(map cdr
(filter (λ (x) (starts-with prefix (car x)))
ls))))
它过滤掉那些在第一项中有前缀的子列表,然后从每个子列表中获取第二项(cdr),最后将add函数应用于所有这些子列表。