2015-07-21 55 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)) 
* 
** 
*** 
**** 
*****