List 方案递归函数列表覆盖

List 方案递归函数列表覆盖,list,recursion,scheme,racket,List,Recursion,Scheme,Racket,我试图做一个递归函数,它得到一个字符串int对列表+一个名为prefix的字符串,并使用名为“starts with”的函数将其开始匹配前缀的所有int相加。 问题是,我无法让列表继续前进,它在一开始就卡住了,然后程序崩溃 (define (sum-of-pairs-start-with prefix ls) ( let*( (prefix2 (string->list prefix)) (str2 (string->list (car (car ls)

我试图做一个递归函数,它得到一个字符串int对列表+一个名为prefix的字符串,并使用名为“starts with”的函数将其开始匹配前缀的所有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)。
我是scheme新手,我不明白为什么会发生这种情况,这很令人沮丧,你只需调用我们之前定义的
过程开始的
(让它负责将字符串转换为字符列表),并修复所有语法问题:

再一次,您在调用过程时遇到了问题。例如,这些片段是错误的:

cdr(car ls)
(else sum-of-pairs-start-with prefix (cdr ls))

请拿一本关于Scheme的书来练习基本语法,记住过程不是这样调用的:
f(x)
,正确的方法是
(fx)
。另外,请注意缩进代码的正确方式,如果遵循约定,则更容易找到错误。

您只需调用前面定义的
开始的
过程(让它负责将字符串转换为字符列表),并修复所有语法问题:

再一次,您在调用过程时遇到了问题。例如,这些片段是错误的:

cdr(car ls)
(else sum-of-pairs-start-with prefix (cdr ls))

请拿一本关于Scheme的书来练习基本语法,记住过程不是这样调用的:
f(x)
,正确的方法是
(fx)
。此外,请注意缩进代码的正确方式,如果遵循约定,则更容易找到错误。

以下是使用更高功能的解决方案:

(define (sum-of-pairs-start-with prefix ls)
  (apply +
         (map cdr
              (filter (λ (x) (starts-with prefix (car x)))
                      ls))))

它筛选出在第一个项目中有前缀的子列表,然后从每个子列表中获取第二个项目(cdr),最后将add函数应用于所有子列表。

以下是使用更高函数的解决方案:

(define (sum-of-pairs-start-with prefix ls)
  (apply +
         (map cdr
              (filter (λ (x) (starts-with prefix (car x)))
                      ls))))

它过滤掉在第一项中有前缀的子列表,然后从每个子列表中获取第二项(cdr),最后对所有子列表应用add函数。

首先,去除所有语法错误。哪些语法错误?racket的编译器没有提到任何..嗯,有语法错误,也有语法错误。比较这两个表达式:
(list(+12))
(list+12)
。编译器或解释器不会抱怨第二个表达式,因为它是一个完全合法的表达式。这也几乎肯定不是你想要的。你如何看待它的“备份”?我在球拍中得到“+:违反合同…”。(顺便说一下,正如预期的那样,您正在尝试添加
cdr
(car ls)
,以及递归结果。)我在调试模式下看到它,它位于“else”行,然后直接返回到它上面的行。首先,清除所有语法错误。哪些语法错误?racket的编译器没有提到任何..嗯,有语法错误,也有语法错误。比较这两个表达式:
(list(+12))
(list+12)
。编译器或解释器不会抱怨第二个表达式,因为它是一个完全合法的表达式。这也几乎肯定不是你想要的。你如何看待它的“备份”?我在球拍中得到“+:违反合同…”。(顺便说一句,正如预期的那样,您正在尝试添加
cdr
(car ls)
,以及递归结果。)我在调试模式下看到它,它在“else”行中,然后直接返回到itLopez上面的行相信我,我已经尽了最大努力,在youtube上观看了它,但我就是不明白。。我已经自己解决了这个问题,但我还有很多问题要解决questions@mooly我知道您正在努力,我赞扬您的努力:-),但在解决更困难的挑战之前,花更多时间熟悉基本语法并解决更简单的问题是个好主意。一些不错的入门书籍:《小阴谋家》、《如何设计程序》。@mooly和(不太适合初学者,但非常好)都可以在网上免费获得。书比youtube好。洛佩兹相信我,我正在尽我最大的努力,在youtube上观看,但我就是不明白。。我已经自己解决了这个问题,但我还有很多问题要解决questions@mooly我知道您正在努力,我赞扬您的努力:-),但在解决更困难的挑战之前,花更多时间熟悉基本语法并解决更简单的问题是个好主意。一些不错的入门书籍:《小阴谋家》、《如何设计程序》。@mooly和(不太适合初学者,但非常好)都可以在网上免费获得。书比youtube好。