我一直在努力做到這一點,這只是令人沮喪,我實際上無法做到這一點。我甚至爲發佈我寫的代碼感到尷尬。我是遞歸新手,所以我需要一些幫助。 我想要做的就是定義一個函數明星是這樣的:任何想法在球拍打印?
> (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))
*
**
***
****
*****