2013-11-14 87 views
0

我想寫使用方案,一個功能:方案 - 遞歸:列表的總和連續元素

  1. 取整數的有兩個以上的元素作爲參數
  2. 和n個列表個元件和第(n + 1)個元素
  3. 返回該列表

結果應該是如下:

> (SumNeighbors (list 1 2 3 4)) 
(3 5 7) 

我覺得我得到添加元素的方式,但我的遞歸是完全錯誤的......

(define (SumNeighbors lst) 
    (if (not (null? (cdr lst))) 
     (append (list (+ (car lst) (car (cdr lst)))) (SumNeighbors (cdr lst))))) 

任何幫助,將不勝感激。

回答

2

此問題的解決方案遵循一個衆所周知的模式。我給你一些提示,如果你發現你自己的方式回答它會更有趣:

(define (SumNeighbors lst) 
    (if <???>     ; if there's only one element left 
     <???>     ; we're done, return the empty list 
     (cons     ; otherwise call `cons` 
     (+ <???> <???>)   ; add first and second elements 
     (SumNeighbors <???>)))) ; and advance recursion 

注意以下幾點:

  • 您的解決方案缺乏基本情況 - 什麼當我們遍歷的列表只剩下一個元素時發生?是時候完成遞歸了!並且因爲我們正在建立一個列表作爲輸出,應該返回什麼值?
  • 我們通常使用cons來構建輸出列表,而不是append。這是建立清單的自然方式
  • 此過程中不屬於解決方案模板的部分是,當列表中存在單個元素時,我們停止,而不是列表爲空時(正常情況下)

您會看到許多遍歷輸入列表並返回列表作爲輸出的過程遵循相同的解決方案模板,因此學習如何工作以及如何工作非常重要,它是編寫解決方案的基礎到其他類似的問題。

+0

非常感謝,它的工作! (定義(SumNeighbors LST) (如果(空?(CDR LST)) 空 (利弊 (+(車LST)(汽車(CDR LST))) (SumNeighbors(CDR LST))))) – lbeziaud

+0

@ user2535792優秀! :) –

1
#!r6rs 
(import (except (rnrs base) map) 
     (only (srfi :1) map)) 

(define (sum-neighbors lst) 
    (map + lst (cdr lst))) 

SRFI-1限定的高階函數map支持不均勻lenght參數。它會停在最短的名單上。

如果你打電話(sum-neighbors '(1 2 3 4))它將成爲(map + (1 2 3 4) (2 3 4))這是一樣的(cons (+ 1 2) (cons (+ 2 3) (cons (+ 3 4) '())))