首页 > 解决方案 > 球拍:为什么不能编译?

问题描述

我正在尝试编写一个简单的函数,该函数将整数添加到从“高”和“低”范围递减的列表中,并以“步长”递增

例如,如果输入为 (3 12 3),则预期输出为 '(12 9 6 3)

以下是以下代码:

(define (downSeries step high low [(define ret '())])
  (if (< high low)
      ret
      (cons ret (- high step))
      (downSeries (step (- high step) low))))

我对球拍很陌生,但我真的不确定为什么不编译。有小费吗?谢谢你。

标签: racket

解决方案


由于仅标记了球拍并且没有描述特殊语言,因此定义窗口中的第一行是#lang racket. 学生语言的答案会有所不同。

1 最后一个参数嵌套在两个括号中,是非法的语法。默认参数只有一组:

(define (test mandatory (optional '()))
  (list mandatory optional))

(test 1)   ; ==> (1 ())
(test 1 2) ; ==> (1 2)

2 您的if表单中有 4 个操作数。最多需要3个!

(if prediate-expression
    then-expression
    else-expression)

查看代码,您应该cons在参数位置有ret表达式。在递归之前拥有它会使它成为死代码。ret永远都是()。例如,这类似于典型的折叠实现:

(define (fold-1 combine init lst)
  (if (null? lst)
      init                             ; fully grown init returned
      (fold-1 combine 
              (combine (car lst) init) ; init grows
              (cdr lst))))

推荐阅读