Scheme FizzBuzz Lambda仅返回最后一个整数
我是Scheme的新手,正在尝试编写一个FizzBuzz函数示例。规则如下: 如果一个数字可以被3和5整除,那么改为说fizzbuzz 否则,如果一个数字可以被3整除,则改为说fizz 否则,如果一个数字可以被5整除,就说buzz 否则请说出号码。 这是我的密码: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
(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循环。我们还没有在课堂上讨论它,所以我不确定我是否可以在这次作业中使用它。