2016-07-23 43 views
-1

我想要寫的函數生產在球拍的列表,與白天結構的列表

1-消耗的自然數(間隔)

2-產生的時間表,其是一個列表的日間結構爲 ,如下所示。

的規則是用於產生每個列表,日程在(上午06點)開始,由給定的時間間隔的增加,並繼續,直到它在(第18小時下午6是)結束添加間隔和沒有按不會超過那個標記。 使用的數據定義:

(define-struct daytime (hours minutes)) 
    ;; A Daytime is a (make-daytime Nat Nat) 
    ;; requires the number that represents hours to be 6<= hours <= 18 
    ;; and requires the number that represents minutes to be < 60 

我有是如何創建與白天結構列表中的問題?我創建了一個列表,但它使用「list」而不是make-day。 這個程序的例子應該是:

(schedule 90) gives 
    (list (make-daytime 6 0) (make-daytime 7 30) (make-daytime 9 0) 
      (make-daytime 10 30) (make-daytime 12 0) (make-daytime 13 30) 
      (make-daytime 15 0) (make-daytime 16 30) (make-daytime 18 0)) 
+0

但你alr伊迪創造了你想要的清單!嘗試(定義my-list(list(make-daytime 6 0)....),然後你可以嘗試(白天 - 小時(第一個(我的列表))),這將給出6.如果你想要更多的可見性,添加# :預製到你的define-struct,當你打印它時,你會看到完整列表的詳細信息。 – MattAPiroglu

+0

沒有那個例子可以告訴你我想讓我的程序運行,你能幫我寫出這個程序嗎? – Tiff

回答

1

你的意思是,定義將返回該列表的功能?嗯,你想要的例子會給你n分鐘的時間間隔。

有很多方法來寫這個,通常基於循環(遞歸或不)。如果你想使用for循環,你將需要一系列值來迭代。如果使用遞歸,則可以遞增該值直到結束條件滿足。您可以在for循環中增加一個值,但它使用了變異,並且在函數式編程中被認爲是一種糟糕的方法。讓我告訴你兩種方法的方式,並給你留下一些細節:)

此外,我將選擇/列表循環運算符,因爲它會很好地爲我們返回一個列表。

for循環:正如我所說的,我們需要迭代的值,所以我們可以使用序列函數來創建值。讓我們用(在範圍內)上的作用:

(sequence->list (in-range 0 (* 12 60) 90)) 

會給你分鐘的增量:

'(0 90 180 270 360 450 540 630) 

完美的,我們可以在這方面努力:

(define (schedule n) 
    (for/list ([val (sequence->list (in-range 0 (* 12 60) n))]) 
    (let ([hour 0] ; <== calculate the hour part here 
      [minute 0]) ; <== and minute here 
     (make-daytime hour minute)))) 

現在,如果你想要做同樣的遞歸:

(define (schedule.v2 n) 
    (define (schedule-aux result current-min) 
    (cond 
     [(>= current-min 720) result] 
     [else 
     (let ([hour 0] ; <== calculate the hour from current-min 
      [minute 0] ; <== calculate the min from current-min 
      [next-min (+ current-min n)]) 
     (schedule-aux 
      (cons (make-daytime hour minute) 
       result) 
      next-min))])) 
    (schedule-aux null 0))