如何使用递归在Racket或Scheme中自动执行重复性任务?

时间:2015-08-09 07:52:15

标签: recursion scheme racket

我帮助我的兄弟(他将作为CS专业开始他的学习)在函数式编程中,我并不熟悉但理解这些原理。

您是否可以帮助我纠正以下用于显示Hello World 10次的Racket脚本,而无需更改或添加特定方法,例如' display' ?

谢谢

#lang Racket
    (define (HelloWorld n)
    (cond [(= n 0) " "]
        [(= n 1) "Hello, world !"]
        [(> n 1) (HelloWorld (- n 1))]
        )
    )

1 个答案:

答案 0 :(得分:4)

您的程序将显示“Hello World!”只有一次,因为在递归调用中你不打印任何东西。只返回调用的最终结果,这包含字符串“Hello World!”。

另一方面,在不打印字符串的情况下显示 n 次字符串的唯一方法是通过连接字符串 n 次来产生结果。例如:

#lang Racket
    (define (HelloWorld n)
    (if (<= n 0)
        ""
       (string-append  "Hello, world ! " (HelloWorld (- n 1)))))

> (HelloWorld 10)
"Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world ! Hello, world !  "

注意递归是如何工作的:最后一种情况是n <= 0(这比n = 0更好,以避免使用负输入进行infinte递归),在这种情况下,结果是空字符串。在n > 0的情况下,一旦字符串与函数的结果应用于n-1,就会获得结果。