2015-07-21 59 views
2

我一直在努力做到这一点,这只是令人沮丧,我实际上无法做到这一点。我甚至为发布我写的代码感到尴尬。我是递归新手,所以我需要一些帮助。 我想要做的就是定义一个函数明星是这样的:任何想法在球拍打印?

> (star 5) 
* 
** 
*** 
**** 
***** 

它应该打印*,然后在**下一行,依此类推,直到你把号码。 一个经典的初学者练习,但在递归球拍中困难得多。谢谢。

回答

2

你没有发布你的尝试解决方案,所以我只能给你一些提示,希望你能够通过你自己的答案;只需填入空格;)。

如果我们将问题分为两部分,会更容易。首先,弄清楚如何创建一个字符串是另一个字符串的重复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) 
=> * 
    ** 
    *** 
    **** 
    ***** 
2

要遍历从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 ...)) 
1

这里是写一个循环与递归函数调用一个方法:

(define (loop from to f done) 
    (if (< from to) 
     (begin 
     (f from) 
     (loop (+ from 1) to f done)) 
     (done))) 

如果from小于to然后循环调用与参数from功能f,然后调用loopfrom+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)) 
* 
** 
*** 
**** 
*****