F # Рекурсивная функция для добавления четных элементов списка

Если вы не можете использовать timeout по какой-либо причине (одна из которых является слишком старой версией python), вот мое решение, которое работает с любой версией python:

  • создает поток, который сначала ждет затем убивает объект subprocess
  • в основном потоке, читает строки в цикле.

Я использую подпроцесс python, работающий с -u (небуферизованный):

передатчик.py: (тестовая программа, которая печатает «hello xx» каждую 1/10-ю секунду)

import time

i=0
while True:
    print("hello {}".format(i))
    i += 1
    time.sleep(0.1)

самой программы (тайм-аут установлен на 1,5 секунды):

import subprocess,threading,time

def timeout(p,timeout):
    time.sleep(timeout)
    p.kill()

p = subprocess.Popen(["python","-u","transmitter.py"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
t = threading.Thread(target=timeout,args=(p,1.5))
t.start()
output = []
for line in p.stdout:
    output.append(line.decode())

t.join()
print("".join(output))

В конце, после таймаута, программа печатает:

hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
hello 10
hello 11
hello 12
hello 13
hello 14
0
задан sopskirk 21 March 2019 в 22:33
поделиться

1 ответ

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

  let rec getEven (input : int list) (acc: int list)  = 
    match input with
    | head :: tail when head % 2 = 0 -> (getEven tail (head :: acc))
    | head :: tail when head % 2 = 1 -> (getEven tail (acc))
    | _ -> acc

  let even = getEven [1..10] []
  let sum = List.sum even

Приведенная выше функция даст:

val getEven : input:int list -> acc:int list -> int list
val even : int list = [10; 8; 6; 4; 2]
val sum : int = 30

P.S. чтобы вычислить сумму элементов, вы должны использовать List.sum вместо List.length, который вернет вам количество элементов в списке. Также обратите внимание, что вы можете вычислить сумму четных элементов в функции getEven, сохраняя не список четных элементов, а их сумму.

0
ответ дан 3615 21 March 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: