2013-09-10 6 views
2

Я пытаюсь написать процедуру, которая добавляет все числа между a и b. Например, если a = 1 и b = 5, процедура добавит 1 + 2 + 3 + 4 + 5. Вот что я до сих пор. Я хочу написать это итеративно. Благодаря!Сумма схемы от a до b Итерационно

(define (sum term a next b) 
    (define (iter a result) 
    (if (> a b) 
     sum 
     (iter ?? ??))) 
    (iter ?? ??)) 

ответ

5

Для начала, обратите внимание, что sum процедуры получает четыре параметров, вы явно будете иметь использовать все из них в качестве части решения, в частности, эти две процедуры будут пчелы необходимы в каком-то момент. Вот что каждый из них представляет:

  • term: функция применяется к каждому элементу последовательности
  • a: стартовый номер диапазона (включительно)
  • next: функцию, чтобы определить следующий элемент последовательности
  • b: окончание число в диапазоне (включительно)

например, это, как вы бы проверить пр oceure с примером в вопросе:

(sum identity 1 add1 5) 
=> 15 

(= (sum identity 1 add1 5) (+ 1 2 3 4 5)) 
=> #t 

Но подождите, как мы его реализуем? это для вас, чтобы обнаружить - он не будет делать вам никакой пользы, если мы дадим ответ сразу же, но я могу дать вам несколько подсказок:

(define (sum term a next b) 
    ; internal procedure for implementing the iteration 
    ; a  : current number in the iteration 
    ; result : accumulated sum so far 
    (define (iter a result) 
    (if (> a b) ; if we traversed the whole range 
     result ; then return the accumulated value 
     (iter ; else advance the iteration 
     ??  ; what's the next value in the range? 
     (+  ; accumulate the result by adding 
      ??  ; the current term in the range and 
      ??)))) ; the accumulated value 
    ; time to call the iteration 
    (iter ??  ; start iteration. what's the initial value in the range? 
     ??))  ; what's the initial value of the sum? 
1

Итак, у вас есть два iter звонков, и вы должны решить, какие значения ставить в них:

  • Для внешнего iter вызова, вы должны решить, что начальное значение для a и result есть.
    • Для начального значения result подумайте о том, что должна вернуть ваша функция, если a были больше, чем b.
  • Для внутреннего iter вызова, вы должны решить, что следующее значение для a и result будет.
    • Для следующего значения: result, вы должны добавить текущий номер к предыдущему результату.

Я надеюсь, что это помогает.

+0

Привет, извините, я относительно новичок в Схеме. Как мне вызвать функцию/выполнить действие? Спасибо! –

+0

Посмотрите на ответ Оскара Лопеса; он объясняет каждый шаг очень, очень хорошо. –

0

Многие алгоритмы требуют итерации, как правило Симпсона для аппроксимирующих интегралы. Мы можем «подделать» итерацию, вызвав итеративный помощник.

(define (sum a b) 
(sum-iter a b 0)) 

(define (sum-iter index n sum) 
    (if (= n index) 
    (+ sum index) 
    (+ (sum-iter n (+ index 1) (+ sum index))) 
) 
Смежные вопросы