我可以在Scheme函数的“ cond”中使用“ let”吗?

时间:2019-08-18 12:54:35

标签: scheme

Scheme的新手,尝试编写一个接受列表的函数,并将三项作为输入,将item1替换为item2,使用let临时命名,然后反转此临时列表并将item3添加到末尾。

这仅用于修改Scheme,而不是作业问题。任何建议表示赞赏:

我尝试使用let*失败,并删除了cond仍然徒劳。

(define (itemreplacer item1 item2 item3 leest)
 (cond ( 
        (eq? (car leest) item1)
        (cons item2 (cdr leest)))
        (else
        (let
          (
           (templist (cons item1 (itemreplacer (cdr (leest))))))
          (reverse (cons item3 templist))))))

它可以工作到item2替换item1的程度,并且仅将其显示为输出。不知何故,reverse行无法运行。

1 个答案:

答案 0 :(得分:1)

let表达式很好,这不是问题。该代码还有更严重的问题:

  • 您忘记为递归编写基本案例
  • 最好使用equal?进行比较(比较笼统)
  • 除非您要调用一个过程,否则不要用方括号括起来,这样的代码将失败:(leest)
  • 递归调用itemreplacer
  • 时,您没有提供正确数量的参数
  • 您的解决方案的总体思路不正确。我们应该在这里使用一个辅助过程(或名为let),以累积部分结果,直到找到item1

由于最后一项,我不得不重写过程的逻辑以满足要求:

(define (itemreplacer leest item1 item2 item3)
  (replacer-helper leest item1 item2 item3 '()))

(define (replacer-helper leest item1 item2 item3 acc)
  (cond ((null? leest) (reverse acc))
        ((equal? (car leest) item1)
         (append (reverse (cdr leest)) (cons item2 acc) (list item3)))
        (else
         (replacer-helper (cdr leest) item1 item2 item3 (cons (car leest) acc)))))         

现在它可以正常工作了:

(itemreplacer '(1 2 4 6 7 8 9 10) 6 5 3)
=> '(10 9 8 7 5 4 2 1 3)

未指定item1的情况下的行为是不确定的,所以我只返回原始输入:

(itemreplacer '(1 2 4 6 7 8 9 10) 13 5 3)
=> '(1 2 4 6 7 8 9 10)