在球拍中循环?

时间:2012-10-19 02:34:07

标签: scheme racket

我熟悉其他语言的while循环但是在这里我写了一个小函数来计算一个术语总和的衍生物但它只做了前两个我想知道是否有办法改变这个以考虑账户超过2?

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

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

(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))))

1 个答案:

答案 0 :(得分:16)

在专业级球拍中,for loops是对序列执行某些操作的标准方法。例如,以下代码生成一个简单的乘法表:

(define numbers (list 1 2 3 4 5 6))
(for/list ([item numbers])
  (list item (* item 2) (* item 3)))

这是一个循环,遍历每个数字,处理它,并生成一个新的结果列表。相当标准;几乎每种编程语言都有一个跨集合的迭代概念。

在您必须为介绍性计算机科学课程编写的那种Racket中,您可能不得不求助于显式递归或更高阶函数,例如map,具体取决于您的教师。这些表达迭代的其他方式与上面的循环具有相同的功能:我们只是略微区别它。

例如,创建上面的小乘法表的相同计算将用显式递归表示如下:

(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)