【问题标题】:How to program this in R5RS? [closed]如何在 R5RS 中编程? [关闭]
【发布时间】:2013-09-08 23:33:01
【问题描述】:

我需要帮助在 dr Racket 中以 r5rs 的语法对此进行编码。调整函数,使其计算前 n 个偶数的总和

【问题讨论】:

  • 适配什么功能?你试过什么了?编辑问题并发布缺失的代码!

标签: scheme racket r5rs


【解决方案1】:

您没有在问题中提供足够的信息来给出准确的答案。哦,好吧 - 只是为了好玩,让我们看看如何使用流来解决这个问题。假设您安装了SRFI-41,以下将在 R5RS 下工作:

; import streams library
(#%require srfi/41)

; generate an infinite stream of numbers
; starting at x, with an n increment
(define (iter x n)
  (stream-cons x (iter (+ x n) n)))

; compute the sum of the first n even numbers
(define (sum-even n)
  (let loop ((evens (iter 0 2))        ; stream of even numbers
             (acc 0)                   ; accumulated sum
             (n n))                    ; generate n numbers
  (if (zero? n)                        ; did we generate enough numbers?
      acc                              ; then return the accumulator
      (loop (stream-cdr evens)         ; else advance recursion
            (+ acc (stream-car evens)) ; update accumulator
            (- n 1)))))                ; one less number to generate

它按预期工作:

(sum-even 6)
=> 30

(= (sum-even 6) (+ 0 2 4 6 8 10))
=> #t

【讨论】:

  • @jozefg kabooom!但说真的,如果 OP 没有指定问题...
  • 很公平,这也是一段不错的代码
【解决方案2】:

本着与 Óscar López 的回答相同的精神,这是另一个基于流的实现:

(#%require srfi/41)
(define (sum-first-n-evens n)
  (stream-fold + 0 (stream-take n (stream-from 0 2))))

【讨论】:

  • 或同样不可接受的(define (sum-fne n) (* n (- n 1)))。 :)
  • +1 重新发明轮子:P
  • @ÓscarLópez 如果有什么安慰的话,我必须非常熟悉 SRFI 41,因为我 ported it to Guile(非常感谢 Mark H Weaver 他的优秀的评论 cmets,帮助将库微调为您今天看到的形式)。
猜你喜欢
  • 1970-01-01
  • 2016-09-19
  • 2011-08-07
  • 1970-01-01
  • 2011-07-28
  • 2012-11-06
  • 2011-07-23
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多