我一直在努力做到这一点,这只是令人沮丧,我实际上无法做到这一点。我甚至为发布我写的代码感到尴尬。我是递归新手,所以我需要一些帮助。 我想要做的就是定义一个函数明星是这样的:任何想法在球拍打印?
> (star 5)
*
**
***
****
*****
它应该打印*,然后在**下一行,依此类推,直到你把号码。 一个经典的初学者练习,但在递归球拍中困难得多。谢谢。
我一直在努力做到这一点,这只是令人沮丧,我实际上无法做到这一点。我甚至为发布我写的代码感到尴尬。我是递归新手,所以我需要一些帮助。 我想要做的就是定义一个函数明星是这样的:任何想法在球拍打印?
> (star 5)
*
**
***
****
*****
它应该打印*,然后在**下一行,依此类推,直到你把号码。 一个经典的初学者练习,但在递归球拍中困难得多。谢谢。
你没有发布你的尝试解决方案,所以我只能给你一些提示,希望你能够通过你自己的答案;只需填入空格;)。
如果我们将问题分为两部分,会更容易。首先,弄清楚如何创建一个字符串是另一个字符串的重复n
倍 - 让我们写这一个辅助程序:
(define (repeat s n)
(cond ((zero? n) <???>) ; base case
(else
(string-append s
(repeat s <???>))))) ; advance recursion
注意,我们还可以使用make-string
一个简单的答案,如@ ThrowawayAccount3Million的证明回答。无论如何,结果应该是这样的:
(repeat "*" 3)
=> "***"
现在我们只把它从我们的star
过程调用在正确的地方:
(define (star n)
(cond ((not (zero? n))
(star <???>) ; advance recursion
(displayln (repeat <???> <???>))))) ; call helper
就是这样!
(star 5)
=> *
**
***
****
*****
要遍历从1至5中使用无非递归:
(let loop ((n 1))
(cond ((> n 5)
(void))
(else
(displayln ...)
(loop (+ 1 n)))))
以上等同于定义一个称为loop
函数然后调用它,这样的:
(define (loop n)
(cond ((> n 5)
(void))
(else
(displayln ...)
(loop (+ 1 n)))))
(loop 1)
这可以出现在另一个功能的内部:
(define (stars num-stars)
(define (loop ...
要打印ñ星:
(displayln (make-string n #\*))
球拍是不生计划,它有它自己的循环结构,您也可以使用:
(for ((n (in-range 1 6)))
(displayln ...))
还有一个库实现Common Lisp/Maclisp的loop
构造(它也具有Chicken Scheme和EMACS Lisp的实现):
(require (planet jphelps/loop)) ;; Download, install, and
;; use the library.
(loop for n from 1 to 5
do (displayln ...))
这里是写一个循环与递归函数调用一个方法:
(define (loop from to f done)
(if (< from to)
(begin
(f from)
(loop (+ from 1) to f done))
(done)))
如果from
小于to
然后循环调用与参数from
功能f
,然后调用loop
与from+1
。如果from
等于to
,则循环完成并调用功能done
。
Example:
> (loop 0 5 display newline)
让我们来定义显示单个明星帮手:
(define (display-star _)
(display "*"))
我们现在可以定义display-stars
通过打印换行显示n
明星和饰面。
(define (display-stars n)
(loop 0 n display-star newline))
原始问题,现在可以解决这样的:
> (loop 1 6 display-stars void)
*
**
***
****
*****
该完整的程序:
#lang racket
(define (loop from to f done)
(if (< from to)
(begin
(f from)
(loop (+ from 1) to f done))
(done)))
(define (display-stars n)
(loop 0 n display-star newline))
(loop 1 6 display-stars void)
使用循环的替代解决方案构造for
:
> (for ([i (in-range 1 6)])
(for ([j i])
(display "*"))
(newline))
*
**
***
****
*****