Scheme 在球拍上打圈?

Scheme 在球拍上打圈?,scheme,racket,Scheme,Racket,我熟悉其他语言中的while循环,但我在这里编写了一个小函数,计算一个项和的导数,但它只做前2个,我想知道是否有办法改变它以考虑2个以上 表达式E表示为列表,因此2x+2y+x^3表示为(+(*2x)(*2y)(expt x 3)) 注意,我已经编写了计算指数的函数,但它是求和的一部分,在前2个之后停止 (define (make-sum v1 v2) (list '+ v1 v2)) (define (diff-sum x E) (make-sum (diff x (first-op

我熟悉其他语言中的while循环,但我在这里编写了一个小函数,计算一个项和的导数,但它只做前2个,我想知道是否有办法改变它以考虑2个以上

表达式
E
表示为列表,因此
2x+2y+x^3
表示为
(+(*2x)(*2y)(expt x 3))

注意,我已经编写了计算指数的函数,但它是求和的一部分,在前2个之后停止

(define (make-sum v1 v2)
  (list '+ v1 v2))

(define (diff-sum x E)
  (make-sum (diff x (first-operator E)) (diff x (last-operator E))))

在专业水平的球拍,是一个标准的方法做一些事情的顺序。例如,下面生成一个简单的乘法表:

(define numbers (list 1 2 3 4 5 6))
(for/list ([item numbers])
  (list item (* item 2) (* item 3)))
它是一个循环,遍历每个数字,对其进行处理,并生成一个新的结果列表。比较规范;几乎每种编程语言都有跨集合迭代的概念

在你必须为计算机科学入门课写的那种杂文中,你可能不得不求助于显式递归或更高阶函数,这取决于你的老师。这些表示迭代的其他方法与上面的循环具有相同的功能:我们只是用稍微不同的方式表达它

例如,创建上述小乘法表的相同计算将通过显式递归表示为:

(define (my-loop numbers)
  (cond [(empty? numbers) '()]
        [else
         (define item (first numbers))
         (cons (list item (* item 2) (* item 3))
               (my-loop (rest numbers)))]))
(my-loop numbers)
并隐式地使用
map

(define (f item)
  (list item (* item 2) (* item 3)))
(map f numbers)