scheme递归函数列表覆盖

时间:2017-01-04 08:56:59

标签: list recursion scheme racket

我试图做一个递归函数,它获取一个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)。 我是计划的新手,我不明白为什么会这样,令人沮丧

2 个答案:

答案 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函数应用于所有这些子列表。