схема потока задачи - PullRequest
       5

схема потока задачи

0 голосов
/ 26 июня 2011

На этой неделе у меня есть новое домашнее задание, я должен написать функцию partSums, которая может добавить элементы в исходный поток для создания нового потока, например:

(element0,element0+element1,element0+element1+element2...)

и результат должен иметь 0 в начале.

в этом примере я предположил, что у нас есть функция с именем integers для создания потока, как в Haskell [1..], поэтому использование partSums на нем должно выглядеть так:

(partSums integers)
> '(1, 3, 6, 10, 15...)

в моем понимании, это так:

  1 2 3  4  5  6 7 8..
    1 2  3  4  5 6 7..
      1  2  3  4 5 6..
         1  2  3 4 5..
            1  2 3 4..
               1 2 .
+                  .
  1 3 6 10 15 21 .....

чтобы добавить 2 потока, которые я сделал:

(define (add-streams s1 s2)
    (cond ((empty-stream? s1) s2)
          ((empty-stream? s2) s1)
          (else (cons-stream
                (+ (head s1)(head s2))
                (add-streams (tail s1) (tail s2))))))

и у меня также есть функции head, tail, cons-stream, они car, cdr, cons для потока.

Может кто-нибудь помочь мне закончить это partSums?

заранее спасибо

bearzk

Ответы [ 3 ]

1 голос
/ 26 июня 2011

HtDP-бот говорит:

  • Можете ли вы записать заявление о назначении и контракт для этой функции? Что он потребляет и что производит?
  • Можете ли вы перевести свои примеры в контрольные примеры? Напишите выражение и значение, которое оно должно произвести. Сравните их, используя «равно?»
0 голосов
/ 27 июня 2011
(define (partial-sums s)
  (let loop ((current 0) (s s))
    (if (empty-stream? s) '()
        (let ((v (+ current (head s))))
          (cons-stream v (loop v (tail s)))))))

это

(partial-sums '(1 2 3 4 5 6 7 8 9))

печать

(1 3 6 10 15 21 28 36 45)

после определения

(define empty-stream? null?)
(define tail cdr)
(define head car)
(define cons-stream cons)
0 голосов
/ 27 июня 2011

Ваш подход состоит в том, чтобы создать группу сдвинутых потоков и добавить их. Это могло бы сработать, если бы вы знали, сколько элементов вы хотите взять, но если количество элементов не определено, вы, конечно, не можете создать бесконечное количество этих потоков!

Другой подход заключается в том, чтобы вести список потоков, из которых вы добавляете в каждой точке, назовите его current-streams, начиная с (list integers). Затем на каждом шаге вы (cons integers current-streams), получаете следующую частичную сумму с (apply + (map head current-streams)) и рекурсивно с current-streams, изменяющимся на (map tail current-streams). Таким образом, вы добавляете серии только по мере необходимости, а не пытаетесь создать бесконечное количество потоков заранее. Но это ресурсоемкий подход, поскольку количество отслеживаемых потоков будет только расти и расти.

Было бы неплохо, если бы вы могли суммировать фиксированное количество потоков (в идеале два, с функцией, которую вы написали!), Чтобы получить желаемый результат. Обратите внимание, что на каждом шаге вывода предыдущий шаг содержит большую часть частичной суммы, которую вы уже рассчитали для вас ... если вы можете найти какой-то способ использования потоков, чтобы воспользоваться этим. Попробуйте записать рекуррентные отношения между последовательными элементами последовательности partSums с помощью последовательности integers, которую вы уже определили, и посмотрите, приведет ли это к возможному другому потоковому подходу ...

...