2014-01-22 75 views
1

我必須編寫一個函數來旋轉列表n次。旋轉由將元素從前面放置到列表的末尾組成。我完全失去了。任何幫助將不勝感激!方案旋轉函數

回答

-2

基本實現將

(define (rotate lst n) 
    (cond 
    [(< n 0) 
    (error "n is negative")] 
    [(or (= n 0) (null? lst)) 
    lst] 
    [else 
    (rotate (append (cdr lst) (list (car lst))) 
      (- n 1))])) 

所以

(rotate '(a b c d e) 3) 
=> '(d e a b c) 

(rotate '(a b c) 5) 
=> '(c a b) 

作爲你應該改進測試(< n 0)(null? lst),因爲這些只需要做一次。

+0

我的解決方案實際上更短,閱讀更清晰,並且沒有相同的計算缺陷。儘管如此,我仍然避免發佈一個實際的代碼解決方案,因爲我希望OP實際上對解決方案進行思考,而不僅僅是切割和粘貼,但我可能不得不重新考慮,以讓我的答案更可能被接受爲名。 –

+0

我也認爲我的解決方案更真實於函數式編程:它是由非常小的可組合的通用函數構建的。 'take','drop'和'append'是任何函數式編程工具箱中的標準函數(就像'map'和'fol​​d'一樣,儘管這些問題在這個問題中沒有使用)。我寧願使用這些組件,也不願意編寫手動循環。再一次,不要試圖冒犯,只是提出我對代碼質量的看法。 (在工作中,我們有強制性的代碼審查,所以我做了很多,並且有一些我習慣的審查風格。對不起,你發現我的風格是冒犯性的。) –

+1

@ ChrisJester-Young答案確實如此說這是一個「基本」的實施。 OP剛剛開始學習這些東西。這個答案顯示瞭解決問題的本地化方法(又名遞歸),另一個顯式地創建了最終結果。偉大的博覽會! :) –

1

您需要使用(或者自己實施,如果這是針對某個課程,並且您的任務需要您手動實施所有內容)takedropappend

  • (take lst n)返回lst第一n元件。例如,(take '(1 2 3 4 5) 3)返回(1 2 3)
  • (drop lst n)lst第一n元素後返回的一切。例如,(drop '(1 2 3 4 5) 3)返回(4 5)
  • (append lst1 lst2)返回包含的lst1所有元素,其次是lst2所有元素的列表。例如,(append '(4 5) '(1 2 3))返回(4 5 1 2 3)

一旦你手頭有這些功能,實現旋轉功能很簡單:

(define (rotate lst n) 
    (let ((n (modulo n (length lst)))) 
    (append (drop lst n) (take lst n)))) 
+0

'(rotate'(a b c)5)'? – uselpa

+0

@uselpa使用'modulo'和'length'。 :-) –

+1

額外獎勵:左側的作品也旋轉(否定'n')。 –