【发布时间】:2017-05-18 12:05:43
【问题描述】:
我正在尝试做一个递归函数,它获取一个字符串-整数对列表+一个名为前缀的字符串,并使用名为“starts-with”的函数总结所有与前缀匹配的整数。 问题是,我永远无法让列表继续前进,它在开始时卡住,然后程序崩溃。
(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)。 我是新来的计划,我不明白为什么会这样,这令人沮丧
【问题讨论】:
-
首先,去掉所有的语法错误。
-
哪些语法错误?球拍的编译器没有提到任何..
-
嗯,有语法错误,还有语法错误。比较这两个表达式:
(list (+ 1 2))和(list + 1 2)。编译器或解释器不会抱怨第二个,因为它是一个完全合法的表达式。这也几乎肯定不是你想要的。 -
您如何看待它“备份”?我在球拍中得到“+:违反合同......”。 (顺便说一句,正如预期的那样;您正在尝试添加
cdr、(car ls)和递归结果。) -
我在 Debug 模式下看到它,它在 "else" 行,然后又回到它上面的行
标签: list recursion scheme racket