Scheme FizzBuzz Lambda仅返回最后一个整数

Scheme FizzBuzz Lambda仅返回最后一个整数,scheme,racket,fizzbuzz,Scheme,Racket,Fizzbuzz,我是Scheme的新手,正在尝试编写一个FizzBuzz函数示例。规则如下: 如果一个数字可以被3和5整除,那么改为说fizzbuzz 否则,如果一个数字可以被3整除,则改为说fizz 否则,如果一个数字可以被5整除,就说buzz 否则请说出号码。 这是我的密码: (define (fizzbuzz n) (print (fizzbuzz1 1 n))) ;; Helper function for fizzbuzz (define (fizzbuzz1 i n) (cond [(an

我是Scheme的新手,正在尝试编写一个FizzBuzz函数示例。规则如下:

如果一个数字可以被3和5整除,那么改为说fizzbuzz 否则,如果一个数字可以被3整除,则改为说fizz 否则,如果一个数字可以被5整除,就说buzz 否则请说出号码。 这是我的密码:

(define (fizzbuzz n)
  (print (fizzbuzz1 1 n)))

;; Helper function for fizzbuzz
(define (fizzbuzz1 i n)
  (cond [(and (= 0 (modulo i 3)) (= 0 (modulo i 5)))
         " fizzbuzz "]
        [(= 0 (modulo i 3))
         " fizz "]
        [(= 0 (modulo i 5))
         " buzz "]
        (i))

  (cond [(< i n) (fizzbuzz1 (+ 1 i) n)]))

(fizzbuzz 21)
但它显示的只是测试用例中的21个。有人能帮我吗


编辑:修正了我的代码并对其进行了更新,但现在我被打印出来了。

您的函数实际上计算出了从1到21的所有数字的正确结果,只是您不需要在输出中显示它们,或者以某种方式收集它们,这样它们就会“丢失”在fizzbuzz1内部计算后,初始打印仅打印fizzbuzz1的结果,即。如果您想使用display(显示)而不是print(打印)来显示它们,为了获得更美观的效果,您可以在cond的每个分支中放置一个显示,例如,这样做,并注意如果您想学习此类语言,您一定要开始以干净的方式缩进您的函数

(define (fizzbuzz n)
  (fizzbuzz1 1 n))

(define (fizzbuzz1 i n)
  (cond [(and (= 0 (modulo i 3) ) (= 0 (modulo i 5) ))
         (display " fizzbuzz ")]
        [(= 0 (modulo i 3))
         (display " fizz ")]
        [(= 0 (modulo i 5))
         (display " buzz ")]
        [else (display i) (display " ")]
        )
  (cond [(< i n) (fizzbuzz1 (+ 1 i) n)])
  )
请注意,在这种情况下,如果您的程序在DrRacket这样的交互式环境中使用,则无需“打印”结果

编辑


这个解决方案的效率不如第一个,但是如果您需要收集某些结构中的所有结果以用于其他任务,那么应该让您知道程序应该具有什么样的结构。另一个例子是,您可以使用cons来收集它们,例如,生成一个字符串列表,而不是简单地用“cons”代替“string append”。

您的函数实际上计算了从1到21的所有数字的正确结果,只需在输出中不显示它们,或者以某种方式收集它们,这样它们在fizzbuzz1内部计算后就会“丢失”。初始打印仅打印fizzbuzz1的结果,即。如果您想使用display(显示)而不是print(打印)来显示它们,为了获得更美观的效果,您可以在cond的每个分支中放置一个显示,例如,这样做,并注意如果您想学习此类语言,您一定要开始以干净的方式缩进您的函数

(define (fizzbuzz n)
  (fizzbuzz1 1 n))

(define (fizzbuzz1 i n)
  (cond [(and (= 0 (modulo i 3) ) (= 0 (modulo i 5) ))
         (display " fizzbuzz ")]
        [(= 0 (modulo i 3))
         (display " fizz ")]
        [(= 0 (modulo i 5))
         (display " buzz ")]
        [else (display i) (display " ")]
        )
  (cond [(< i n) (fizzbuzz1 (+ 1 i) n)])
  )
请注意,在这种情况下,如果您的程序在DrRacket这样的交互式环境中使用,则无需“打印”结果

编辑


这个解决方案的效率不如第一个,但是如果您需要收集某些结构中的所有结果以用于其他任务,那么应该让您知道程序应该具有什么样的结构。另一个例子是,您可以使用cons来收集它们,例如,生成一个字符串列表,而不是一个字符串,只需将'cons'替换为string append。

此外,如果您在使用racket标记后使用racket,您可能会发现racket的构造在这里很有用

使用for和display,正如Renzo所说,您可以这样编写fizzbuzz:

#lang racket

(define (fizzbuzz n)
  (for ([i (in-range n)])
    (cond [(and (= 0 (modulo i 3)) (= 0 (modulo i 5)))
           (displayln "fizzbuzz")]
          [(= 0 (modulo i 3))
           (displayln "fizz")]
          [(= 0 (modulo i 5))
           (displayln "buzz")]
          [else (displayln i)])))

(fizzbuzz 21)
另一个选项是使用,与for类似,但将结果累积到列表中:

#lang racket

(define (fizzbuzz n)
  (for/list ([i (in-range n)])
    (cond [(and (= 0 (modulo i 3)) (= 0 (modulo i 5)))
           "fizzbuzz"]
          [(= 0 (modulo i 3))
           "fizz"]
          [(= 0 (modulo i 5))
           "buzz"]
          [else i])))

(fizzbuzz 21)
(apply string-append (fizzbuzz 21))

此外,如果您在使用racket标记后使用racket,您可能会发现racket的构造在这里很有用

使用for和display,正如Renzo所说,您可以这样编写fizzbuzz:

#lang racket

(define (fizzbuzz n)
  (for ([i (in-range n)])
    (cond [(and (= 0 (modulo i 3)) (= 0 (modulo i 5)))
           (displayln "fizzbuzz")]
          [(= 0 (modulo i 3))
           (displayln "fizz")]
          [(= 0 (modulo i 5))
           (displayln "buzz")]
          [else (displayln i)])))

(fizzbuzz 21)
另一个选项是使用,与for类似,但将结果累积到列表中:

#lang racket

(define (fizzbuzz n)
  (for/list ([i (in-range n)])
    (cond [(and (= 0 (modulo i 3)) (= 0 (modulo i 5)))
           "fizzbuzz"]
          [(= 0 (modulo i 3))
           "fizz"]
          [(= 0 (modulo i 5))
           "buzz"]
          [else i])))

(fizzbuzz 21)
(apply string-append (fizzbuzz 21))

你说字符串附加方法更优雅,但我一看到它就退缩了。这就像在循环中看到string+=而不是使用StringBuilder,这是一个Schlemiel the Painter问题。我编辑了答案,但我认为学习递归的人应该首先学习如何编程,然后学习如何高效编程。当然,你的经验可能和我的不同。你可以使用cons进行递归。使用append或任何与之相关的东西进行递归,只不过是向画师Schlemiel求教而已。:-例如,您可以先创建一个字符串列表,然后使用apply对结果进行单个字符串追加。这个答案基本正确,但我发现缩进建议通常不好,一行上不应该只有一个括号!看。此外,建立这样一个字符串并不适合手头的任务;你真的应该把它显示在cond里。我正在DrRacket里面写这个程序。我不明白的是,我什么时候需要打印报表,什么时候不需要。因为几天前我写了一个不同的函数,返回列表中的最大值。在这种情况下,我不需要告诉它显示到控制台,它只是自己做的。你说字符串append方法更优雅,但当我看到它时,我退缩了。这就像在循环中看到string+=而不是使用StringBuilder,这是一个Schlemiel-the-Painter问题
获得递归应该首先学习如何编程,然后学习如何高效编程。当然,你的经验可能和我的不同。你可以使用cons进行递归。使用append或任何与之相关的东西进行递归,只不过是向画师Schlemiel求教而已。:-例如,您可以先创建一个字符串列表,然后使用apply对结果进行单个字符串追加。这个答案基本正确,但我发现缩进建议通常不好,一行上不应该只有一个括号!看。此外,建立这样一个字符串并不适合手头的任务;你真的应该把它显示在cond里。我正在DrRacket里面写这个程序。我不明白的是,我什么时候需要打印报表,什么时候不需要。因为几天前我写了一个不同的函数,返回列表中的最大值。在这种情况下,我不需要告诉它显示到控制台,它只是自己做的。谢谢你的回答。我将检查球拍的for循环。我们还没有在课堂上讨论它,所以我不确定我是否可以在这项作业中使用它。谢谢你的回答。我将检查球拍的for循环。我们还没有在课堂上讨论它,所以我不确定我是否可以在这次作业中使用它。