Wednesday, 18 December 2019

Movendo média clojure


Este fim de semana eu decidi tentar minha mão em algum Scala e Clojure eu sou proficiente com a programação orientada objeto, e assim que Scala era fácil de pegar como uma língua, mas quis experimentar a programação funcional Isto é onde obteve hard. I apenas pode T parecem obter a minha cabeça em um modo de funções de escrita Como um programador perito funcional, como você abordar um problema. Dada uma lista de valores e um período definido de soma, como você geraria uma nova lista da média móvel simples de A lista. Por exemplo dados os valores de lista 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 eo período 4, a função deve retornar 0 0 , 0 0, 0 0, 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5. Depois de passar um dia pensando nisso, o melhor que pude encontrar em Scala foi this. I know Isso é horrivelmente ineficiente, eu prefiro muito fazer algo como. Agora isso seria feito facilmente em um estilo imperativo, mas eu não posso para a vida de mim trabalhar para fora como expressar esse problema funcionalmente. Interessante eu posso pensar em ma Ny soluções, com diferentes graus de eficiência Ter que adicionar coisas repetidamente não é realmente um problema de desempenho, mas vamos supor que é também, os zeros no início pode ser prepended mais tarde, por isso não se preocupe com a produção deles Se o algoritmo fornece Eles naturalmente, multa se não, nós corrigi-lo mais tarde. Começando com Scala 2 8, o seguinte daria o resultado para o período n usando deslizamento para obter uma janela deslizante da List. Nevertheless, embora este é bastante elegante, ele doesn t Têm o melhor desempenho possível, porque ele não tira proveito de adições já calculadas Então, falando deles, como podemos obtê-los. Vamos dizer que escrevemos isso. Temos uma lista da soma de cada dois pares Vamos tentar Use este resultado para calcular a média móvel de 4 elementos A fórmula acima fez o seguinte computation. So se tomarmos cada elemento e adicioná-lo ao segundo elemento seguinte, obtemos a média móvel para 4 elements. We pode fazê-lo como este. Poderíamos então calcular a média móvel Para 8 elementos, e assim por diante Bem, há um algoritmo bem conhecido para calcular as coisas que seguem esse padrão É mais conhecido por seu uso na computação do poder de um número Ele vai assim. Então, vamos aplicá-lo aqui. Então , Aqui s a lógica O período 0 é inválido, o período 1 é igual à entrada, o período 2 é a janela deslizante do tamanho 2 Se maior do que isso, pode ser par ou ímpar. Se for ímpar, adicionamos cada elemento ao movingSum do Próximo odd - 1 elementos Por exemplo, se 3, adicionamos cada elemento ao movingSum dos próximos 2 elementos. Se mesmo, nós computar o movingSum para n 2, em seguida, adicionar cada elemento para o n 2 passos depois. Com essa definição, Podemos então voltar para o problema e fazer isso. Há uma pequena ineficiência no que diz respeito ao uso de mas é o período O, não Ele pode ser feito mais eficiente com uma função recursiva cauda E, claro, a definição de deslizamento I Fornecido é horrendo desempenho-sábio, mas haverá uma definição muito melhor dele em Scala 2 8 Note que nós podemos t fazer um Eficiente método deslizante em uma lista, mas podemos fazê-lo em um Iterable. Having disse tudo isso, eu d ir com a primeira definição, e otimizar apenas se uma análise do caminho crítico indicou isso como um grande negócio. Para concluir, vamos considerar Como eu fui sobre o problema Temos um problema de média móvel Uma média móvel é a soma de uma janela em movimento em uma lista, dividido pelo tamanho dessa janela Então, primeiro, eu tento obter uma janela deslizante, somar tudo sobre ele, E depois dividir pelo tamanho. O próximo problema era evitar a repetição de adições já calculadas Neste caso, fui para a menor adição possível, e tentou descobrir como calcular maiores somas reutilizando tais resultados. Finalmente, vamos tentar Resolver o problema do jeito que você imaginou, adicionando e subtraindo do resultado anterior Conseguir a primeira média é fácil. Agora fazemos duas listas Primeiro, a lista de elementos a serem subtraídos Próximo, a lista de elementos a serem adicionados. Adicione estas duas listas usando zip Este método só irá prod Uce como muitos elementos como a lista menor tem, o que evita o problema de subtrair sendo maior do que o necessário. Fechamos compondo o resultado com um fold. which é a resposta a ser retornado a função inteira se parece com this. I sei Clojure melhor do que Scala, então aqui vai Como eu escrevo esta outra entrada Clojure aqui é imperativo que não é realmente o que você re após e isn t idiomatic Clojure O primeiro algoritmo que vem à minha mente é repetidamente tendo o número solicitado de elementos da seqüência, soltando O primeiro elemento e recorrente. O seguinte funciona em qualquer tipo de vetor de seqüência ou lista, preguiçoso ou não e dá uma seqüência preguiçosa de médias --- o que poderia ser útil se você estiver trabalhando em uma lista de tamanho indefinido Note que leva Cuidado do caso de base, implicitamente retornando nil, se não houver elementos suficientes na lista para consumir. Fazendo isso em seus dados de teste yields. It doesn t dar 0 para os primeiros elementos na seqüência, embora que poderia facilmente ser manipulado alguns O que artificially. The coisa mais fácil de tudo é ver o padrão e ser capaz de trazer à mente uma função disponível que se encaixa a partição factura dá uma visão preguiçosa de porções de uma seqüência, que podemos, em seguida, mapear. Alguém pediu uma cauda Recursiva versão recursão cauda vs preguiça é um pouco de um tradeoff Quando o seu trabalho é a construção de uma lista, em seguida, fazer a sua função cauda recursiva é geralmente muito simples, e isso não é nenhuma exceção --- apenas construir a lista como um argumento para uma subfunção Nós vamos acumular para um vetor em vez de uma lista, porque senão a lista será construída para trás e terá que ser revertida no final. Loop é uma maneira de fazer uma função interna anônima tipo de Scheme s chamado let recur deve ser usado Em Clojure para eliminar chamadas de cauda conj é um generalizado cons anexando da maneira natural para a coleta --- o início das listas eo fim dos vetores. 24 de agosto 09 em 2 58.I ve decidiu adicionar a este velho Q, Porque o tema surgiu novamente e eu f Ind preferrable para apontar para esta coleção agradável de soluções possíveis, adicionando minha própria tomada, que é diferente das versões anteriores em Clojure, como explicado no A Talvez possamos construir o repositório mais completo da Web de implementações de mov-avg funcional - Micha Marczyk Mar 2 10 em 0 20.Here sa parcialmente ponto-livre uma linha Haskell solution. First aplica caudas para a lista para obter as listas de caudas, so. Reverses-lo e cai as primeiras p entradas tomando p como 2 here. In caso você Aren t familiarizado com o símbolo ponto de mamilo, é o operador de composição funcional, ou seja, passa a saída de uma função como a entrada de outro, compondo-os em uma única função gf significa executado f em um valor, em seguida, passe a saída para g , Então fgx é o mesmo que gfx Geralmente seu uso leva a um estilo de programação mais clara. Em seguida, mapeia a função fromIntegral p sum pegue p na lista Então, para cada lista na lista ele pega os primeiros elementos p, resume-os e depois divide Por p Então Nós apenas inverter a lista de volta novamente com reverse. This tudo parece muito mais ineficiente do que é reverso doesn t fisicamente inverter a ordem de uma lista até que a lista é avaliada, ele só coloca-lo para fora na pilha boa ol lazy Haskell caudas também Doesn t criar todas essas listas separadas, ele apenas se refere a diferentes seções da lista original Ainda não é uma grande solução, mas uma linha longa. Aqui está um pouco mais agradável, mas solução mais longa que usa mapAccum para fazer uma subtração de deslizamento e adição. Primeiro Dividimos a lista em duas partes em p, so. Sum o primeiro bit. Zip o segundo bit com a lista original isto apenas pares fora itens em ordem das duas listas A lista original é, obviamente, mais tempo, mas perdemos este pouco extra. Agora definimos uma função para o nosso mapAccum ulator mapAccumL é o mesmo que mapa, mas com um parâmetro de acumulador de estado de execução extra, que é passado do mapeamento anterior para o próximo como o mapa é executado através da lista Usamos o acumulador como nossa média móvel , E como a nossa lista é formada pelo elemento que acabou de sair da janela deslizante eo elemento que acabou de inseri-la na lista que acabamos de fechar, a nossa função de deslizar tira o primeiro número x da média e adiciona o segundo número y Então nós Passar o novo s ao longo e retorno s dividido por p segundo segundo só leva o segundo membro de um par de tuplas, que é usado para tomar o segundo valor de retorno de mapAccumL, como mapAccumL irá retornar o acumulador, bem como a lista mapeada. Para aqueles De você não está familiarizado com o símbolo é o operador de aplicação Não realmente fazer nada, mas tem um tem baixo, direito-associativa vinculação precedência, por isso significa que você pode deixar de fora os colchetes tomar nota LISPers, iefx é o mesmo que f X 0, 0, 0, 0, 0, 0, 9 0, 4 0, 1 0 rendimentos 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5 para qualquer solution. Oh e você precisará importar o módulo List para compilar qualquer solução. Daniel Graças Escrever código é muito mais fácil do que explicá-lo - Você já descreveu a essência dele Duas Listas Fluxos são mantidos em ambas as funções e obter suas cabeças retiradas durante cada iteração One List Stream serve como a coleção principal para iterar enquanto o outro O fluxo de lista, que é a mesma coleção, exceto que tem menos do período retirado, é usado no cálculo da nova média móvel. A linguagem de programação J facilita programas como a média móvel. Menos caracteres em que no seu rótulo, média móvel. Para os valores especificados nesta pergunta, incluindo os valores de nome aqui é uma maneira simples de código this. We pode descrever isso usando etiquetas para componentes. Cada exemplo, usar exatamente o mesmo programa O único Diferença é o uso de mais nomes na segunda forma Esses nomes podem ajudar os leitores que don t sabem as primárias J. Vamos olhar um pouco mais para o que está acontecendo no subprograma, média d O resultado do cálculo da média móvel, escrito aqui, não inclui a contagem de valores nominais. Zeros à esquerda esperados na pergunta original Esses zeros são indiscutivelmente não fazem parte do cálculo previsto. A técnica utilizada aqui é chamada de programação tácita É praticamente o mesmo que o estilo livre de pontos de programação funcional. contestada agosto 26 10 em 16 15. Aqui está Clojure fingindo ser uma linguagem mais funcional Esta é totalmente cauda-recursiva, btw, e inclui zeros à esquerda. Normalmente, coloco a coleção ou o último parâmetro lista para tornar a função mais fácil de curry Mas em Clojure. is tão pesado, eu costumo Acabam fazendo isso. Em que caso, realmente não importa o que os parâmetros de ordem go. answered 09 de agosto 09 às 4 56.Hi Jonathan, eu sou muito novo para esta programação funcional, você poderia explicar-me como th Is is tail-recursive Obrigado James P Aug 24 09 at 14 38. A recursão acontece na instrução if, em que uma ou outra opção se baseia em recur Isto calculará todos os parâmetros primeiro e somente então recurse A resposta será o resultado de recurrir como O resultado é o mesmo resultado retornado pela recursividade, sem outros cálculos, este é o recursivo da cauda. Daniel C Sobral Ago 24 09 às 15 20. Este exemplo faz uso do estado, uma vez que para mim é uma solução pragmática neste caso, e uma Fechamento para criar a função de averbação média. Ainda é funcional no sentido de fazer uso de funções de primeira classe, embora não seja efeito colateral livre As duas línguas que você mencionou tanto correr em cima da JVM e, portanto, ambos permitem estado - Gestão, quando necessário. Respondido 24 de agosto 09 em 1 55. Esta solução está em Haskell, que é mais familiar para me. answered 24 de agosto 09 às 10 23.I como o uso da declaração de partida eu tentei fazer algo semelhante, mas couldn t Bastante fazer todo o caminho até lá James P 24 ago 09 at 14 39. Uma versão curta do Clojure que tem a vantagem de ser o comprimento da lista O, independentemente do seu período. Isso explora o fato de que você pode calcular a soma de um intervalo de números, criando uma soma cumulativa da seqüência, por exemplo, 1 2 3 4 5 - 0 1 3 6 10 15 e, em seguida, subtraindo os dois números com um deslocamento igual ao seu período. Chegando no final da festa, e novo para a programação funcional também, cheguei a esta solução com uma função inner. I adotou a idéia, para Dividir a lista inteira pelo período len antecipadamente Então eu gerar a soma para começar com os len-first-elements E eu gerar os primeiros, elementos inválidos 0 0, 0 0.Then I recursivamente subtrair o primeiro e adicionar o último valor No final eu listify o thing. answered inteiro 29 de abril 10 em 19 28. Em pseudocode de Haskell. A chave é a função tails, que mapeia uma lista para uma lista de cópias da lista original, com a propriedade de que o n-ésimo elemento do resultado Está faltando os primeiros elementos n-1. Aplicamos fmap avg tomar n para o resultado, o que significa que tomamos o prefixo n-length da sublista e calculamos seu avg Se o comprimento da lista que estamos avaliando não é n, Então nós não calculamos a média, uma vez que é indefinido Nesse caso, devolvemos Nada Se for, nós fazemos, e envolvê-lo em Just Finally, vamos correr catMaybes sobre o resultado de fmap avg tomar n, para se livrar do Talvez Eu fiquei surpreso e decepcionado com o desempenho do que me pareceu as soluções mais idiomáticas Clojure, JamesCunningham s preguiçoso-seq solutions. So aqui uma combinação de James solução com a idéia de s de adaptação rápida - Exponencial para mover sums. Edit este baseado na solução mikera s - é ainda faster. answered Jul 22 13 às 19 21.Your Resposta.2017 Stack Exchange, Inc. Clojure Programming By Example. This destina-se a ser uma mão em primeiro olhar para Clojure Se você quiser experimentar os exemplos como você vá, então você pode querer já ter criado um ambiente de trabalho como por Para que você possa ver os resultados do código de exemplo. Clojure programas são escritos em formulários Formulários entre parênteses indicam função calls. calls a função com argumentos 1 2 3 e retorna o valor 6, a soma de arguments. New funções podem ser definidas usando Defn. Here x e y são símbolos representando os argumentos de entrada Função é chamada para dividir a soma de xey por 2 Note que os formulários estão sempre em notação de prefixo, com função seguida por argumentos subseqüentes Agora, a média pode ser invocada como. e retornará 4 Neste exemplo, a média é um símbolo, cujo valor é uma função referem-se a uma explicação detalhada de forms. Clojure fornece acesso fácil à JVM. This chama o método show sobre o resultado do qual constrói um novo Jframe Observe o ponto final antes A chamada de método eo ponto final após a construção referem-se. Funções podem ser passadas para outras funções. Retorna 5 7 9 Map é uma função que toma outra função e chama-a com argumentos retirados de coleções seguintes No nosso caso nós fornecemos a função E dois vetores de inteiros O resultado é uma lista dos resultados de chamar com argumentos tirados dos vetores Usar funções como argumentos para outras funções é muito poderoso Podemos usar nossa função média previamente definida com mapa como so. returns 5 2 7 2 9 2 Vemos aqui que Clojure suporta rácios como um tipos de dados referem-se a uma lista completa. Funções também podem retornar outras funções. Aqui addx retornará uma nova função que leva 1 argumento e adiciona x para it. returns uma função que pode ser chamado Com 1 argumento e irá adicionar 5 a it. returns 6 7 8 9 10 Eu chamei o mapa com um resultado de addx, que era uma função que leva um argumento e acrescenta 5 Essa função foi chamada na lista de números que forneceu. There é um Shorthand forma de criar uma função anônima. Will criar uma função que chama com dois argumentos 1 e 2.Will adicionar 5 à lista de números que forneceu A capacidade de passar e criar funções dinamicamente é referido como de primeira classe functions. Functional Programming Trata a computação como a avaliação de funções matemáticas e evita dados estatais e mutáveis ​​Em uma linguagem imperativa você normalmente criaria variáveis ​​e alteraria seu valor regularmente Em Clojure você retorna novos resultados sem modificar o que havia antes. Funções sem efeitos colaterais Editar. Função lado Efeitos podem estar mudando os valores de entradas, mudando dados globais, ou executando IO. Imperative void moveplayer p, x, y. updates um jogador objeto com um novo local. Object Orientado classe player. again, muda um objeto existente. Funcional moveplayer oldp X ya jogador completamente novo é devolvido, o jogador antigo não é afetado. Em imperativo você só sabe que p mudou porque o nome da função dicas E ele mig Ht mudou outras coisas, como alguns dados do mundo também Em FP oldp é preservado você don t precisa se preocupar com o que aconteceu com ele ou o mundo - nada pode mudar e é explícito que um novo jogador é devolvido como resultado de mover . As principais vantagens aqui são raciocínio, testabilidade e simultaneidade A linguagem reforça que não há efeitos colaterais para que você possa inferir comportamento Entradas diretamente mapear para saídas que torna mais fácil para construir e pensar sobre casos de teste Dois segmentos podem operar simultaneamente sobre o mesmo Dados sem risco de eles corromper uns aos outros, como os dados não serão alterados. Considere a remoção de um item de uma lista A solução imperativa iria modificar a lista no lugar Uma solução funcional iria retornar uma lista completamente nova, deixando o original no lugar Isso Sons na superfície para ser um desperdício, mas há muitas maneiras que este é otimizado pelo compilador para ser muito eficiente. Código sem variáveis ​​para alguém usado para programação imperativa pode tomar al Ittle se acostumar a Aqui está um guia rápido para converter código de estilo variável em código funcional. Você deseja acumular algumas alterações Edit. Rearrange este tipo de coisas em um formulário que não exige variáveis. 1 100 2 cria uma sequência preguiçosa de números 1 3 5 7 99 1 é o ponto de partida, 100 é o ponto final, 2 é o passo reduzir chama a função Primeiro chama com dois argumentos, os dois primeiros números fornecidos pelo intervalo Então Ele chama novamente com o resultado anterior e o próximo número, até que todos os números estejam exaustos. Clojure tem muito suporte para seqüências, coleções e operações de alto nível. À medida que você as aprende, você encontrará maneiras muito expressivas de escrever tarefas como esta. Quer iterar, em vez de usar o loop recur construir Editputes o fatorial de 5 O loop especial forma estabelece ligações seguidas por expressões a serem avaliadas Neste exemplo 5 é vinculado a i e 1 é ligado a acc Se a forma especial, em seguida, testa se i é Igual a zero Uma vez que, não é igual a 0, a recurência relança novos valores para i e acc antes de retornar o controle de volta para o topo do laço, a fim de reavaliar o corpo de suas expressões A decremented i dec i é rebound to i e the Produto de acc E i acc i é rebound to acc Este loop é recursivamente chamado até que i igual a 0 acc armazena o resultado da multiplicação de cada valor i tomado Note que uma ligação se comporta como uma variável. Também, recur pode segmentar um loop ou função definition. In Acima, a função fatorial pode tomar tanto um argumento n, o que resulta na avaliação de. Or fornecendo 2 argumentos resultados em avaliação de. recuridade é importante porque ele reencaminha as entradas da função s em vez de adicionar uma chamada recursiva para a pilha Tivemos Em vez disso, usaríamos fatorial dec n acc n teríamos um comportamento semelhante, mas para valores grandes de n, você pode causar um estouro de pilha. Note também que introduzimos duas definições para factorial, uma com um argumento e outra com dois argumentos. Uma versão de argumento, que é traduzida para a forma de dois argumentos para avaliação A aridade de uma função é o número de argumentos que a função assume. Claro que poderíamos ter escrito uma definição ainda mais simples semelhante Para a soma anterior exemplo ímpar. Você precisa salvar um resultado e usá-lo várias vezes Edit. There é uma macro útil deixar que vincula um símbolo para um valor de uso local. in este deixar formar um número aleatório entre 0 e 0 8 é Gerado, 0 2 é adicionado e o resultado é ligado ao símbolo g Uma cor é construída com valores de verde vermelho azul de g, que será uma escala de cinza de intensidade variando de 0 2 a 1. Você quer fazer múltiplas chamadas de método No mesmo objeto Edit. Using bibliotecas java, muitas vezes coloca você em uma situação onde você deseja usar uma variável local Tenha em mente doto A grande coisa sobre doto é que ele retorna o objeto após a aplicação de várias calls. Mutando variáveis ​​de estado permanente Edit. Clojure Suporta muitos tipos mutable, no entanto, é importante saber a diferença entre eles e como eles se comportam Os tipos fornecidos são refs, agentes, átomos e vars. Refs são como ref células em ML, caixas em Scheme ou ponteiros em outras línguas É Uma caixa, que você pode mudar o conteúdo de Bu T ao contrário das outras línguas, a torção é que você só pode fazer a mudança dentro de uma transação Isso garante que dois segmentos não podem ter um conflito ao atualizar ou acessar o que está armazenado dentro do ref. declares r para ser um ref com valor inicial de Nil. sets r to 5 em um transaction. gets o valor de r, que é 5 Note que r é abreviação para deref r, e funciona com todos os tipos mutable Clojures r em si é um ref, não um valor. Agentes Edit. Agents São modificadas por funções de forma assíncrona Você envia uma função para o agente, que posteriormente aplicará essa função ao seu valor atual É assíncrona porque a chamada para enviar retorna imediatamente A função está enfileirada em um pool de threads para execução, proporcionando um acesso conveniente a multi - threading. Neste exemplo, definimos um agente com valor inicial 1 Enviamos o agente uma função inc, que incrementa seu argumento Agora enviar filas que a função de execução por um pool de threads aguardar irá bloquear até que todas as funções pendentes em um agente h Ave concluído um retorna o valor de nosso agente, que é agora 2, porque 1 foi incrementado. Atoms são modificados por funções de forma síncrona Você chama swap ea função que você fornece é aplicada ao valor do átomo antes swap returns. Note que swap retorna O resultado da função ter sido aplicada ao valor do átomo atual Refs são coordenadas enquanto agentes e átomos são descoordenados Isso significa que em um ambiente multi-threaded, refs são modificados em uma transação que garante que apenas um thread pode modificar o valor em um Enquanto átomos e agentes fazem fila para alterar as funções para garantir que as mudanças ocorrem atomicamente Todos eles são seguros, eles apenas usam estratégias diferentes para fornecer esta segurança. Vars são como variáveis ​​globais em outros idiomas A ligação raiz é um valor inicial que é Compartilhada por todos os segmentos A construção de ligação age como se a var tivesse sido alterada, mas ela é automaticamente restaurada para seu valor anterior ao sair do escopo da constante de ligação Ruct. Establece um Var algo com o valor 5 Declaring funções realmente estabelece-los como Vars Você deve evitar o uso de def, e especialmente evitar definir já declarou ligações com def Depois de chamar def algo 6 não é uma operação thread-safe. Por que Clojure não tem variáveis ​​locais é uma questão muitas vezes levantada Mutação localmente é tão difícil de raciocinar quanto mutação globalmente, independente da concorrência Ver, por exemplo, um típico Java para loop que define outras vars locais e contém quebras retorna Se leva mais pensamento Inicialmente para construir soluções que não precisam de variáveis, por favor, tente gastar o esforço - ele irá reembolsá-lo muitas vezes. No entanto, para apoiar a tradução direta de algoritmos imperativos, existe uma macro útil chamado with-local-vars que declara vars locais que Pode ser alterado com var-set e ler com var-get ou para taquigrafia. Esta é uma versão de factorial usando variáveis ​​Como você pode ver, não é tão bom como as versões descritas anteriormente, e é puramente para demonstrar um local Var ligação Este É completamente seguro para chamar em um ambiente multi-threaded como as variáveis ​​são locais No entanto, variáveis ​​locais não podem ser permitidos vazamento fora de seu scope. causes Var null é unbound A razão é t Hat f retorna uma nova função que adiciona 2 a uma variável local definida em f Portanto, a função retornada está tentando manter uma variável local de f Agora, as variáveis ​​locais estão sujeitas a mudanças, mas se a mudança ocorrer em um ambiente multi-thread , E essa variável tinha vazado fora de seu escopo original, a mudança não seria mais local. A clausura é um termo usado quando os símbolos são retidos fora de sua definição. Aqui criamos duas funções que ambos acessam um segredo de ref Nós criamos dentro de um let , Então o segredo não é visível no nosso escopo atual more. causes Não é possível resolver o segredo do símbolo neste contexto. No entanto, as próprias funções reteram segredo e podem usá-lo para comunicar. resultados em nada. Clojure Movendo a média de Java para Clojure. Clojure tem um para trabalhar com filas Eu não sei por que ele não tem um leitor macro, mas funciona bem e retorna uma coleção Clojure você pode lidar com contras e peek. You pode começar com um Vazio com ou inserir seus itens no construtor. I escreveu algum material sobre isso em português, se você tiver qualquer interest. On 20 07 2017, em 08 48, Cecil Westerhof wrote. I estava apenas querendo saber qual é a melhor maneira de traduzir este Para Clojure. No momento Clojure não tem uma fila Devo usar apenas as chamadas Java, ou há uma maneira melhor .-- Cecil Westerhof - Você recebeu esta mensagem porque você está inscrito no grupo Grupos do Google Clojure Para postar no Este grupo, envie um e-mail para Note que as postagens dos novos membros são moderadas - por favor, seja paciente com o seu primeiro post Para cancelar a inscrição deste grupo, envie um email para clojure Para mais opções, visite este grupo em --- Você recebeu esta mensagem porque você está Inscritos nos grupos do Google Clojure grou P Para cancelar a inscrição deste grupo e parar de receber emails dele, envie um email para Para mais opções, visite .-- Você recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure Para postar neste grupo, envie um e-mail para Note que Os posts dos novos membros são moderados - por favor, seja paciente com o seu primeiro post Para cancelar a inscrição neste grupo, envie um email para clojure Para mais opções, visite este grupo em --- Você recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure To Cancelar a inscrição deste grupo e parar de receber e-mails a partir dele, enviar um e-mail para Para mais opções, visite. Mike Fikes Na verdade, há uma implementação de fila Aqui está uma maneira de usá-lo para o seu problema defn make-moving-average-fila n átomo defn Update-moving-average-queue old-queue valor-próximo let current-total current-total old-queue valor-próximo valores-vel conj valores-velhos old-queue valor-próximo if count old-values ​​comprimento old-queue let current - total - atual-total primeiro valores-velhos valores-velhos . Existe realmente uma implementação de fila Aqui está uma maneira de usá-lo para o seu problema. Defn make-moving-average-queue n átomo atual-total 0 0 valores antigos. Defn update-moving-average-fila old-queue valor-próximo let current-total current-total old-queue valor-próximo old-values ​​conj valores-velhos old-queue valor-próximo if count old-values ​​comprimento old-queue let Current-total-current-total first-old-values ​​old-values ​​pop valores-velhos assoc old-queue current-total current-total old-values ​​old-values ​​assoc old-queue current-total current-total old-values ​​old-values . Defn move-average old-queue valor próximo let new-queue troca old-queue atualização-moving-average-queue valor próximo current-total nova-fila count old-values ​​nova-fila. Def queue-06 make-moving-average-queue 6. entradas def-06 20 22 21 24 24 23 25 26 20 24 26 26 25 27 28 27 29 27 25 24. input input-06 entrada. 10 input-10 input-10 input-10 20 22 24 25 23 26 28 26 29 27 28 30 27 29 28. entradas de input de doseq-10 println entrada de queue-10 de média móvel -... Você Recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure Para publicar neste grupo, envie um e-mail para Nota que as postagens dos novos membros são moderadas - por favor, tenha paciência com o seu primeiro post Para anular a subscrição deste grupo, envie um e-mail para clojure , Visite este grupo em --- Você recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure Para cancelar a inscrição deste grupo e parar de receber e-mails dele, envie um email para Para mais opções, visite. Mike Fikes Hey Cecil, Além de usar peek em vez de primeiro, como indicado por Plinio, a função de média móvel acima usa alguns nomes pobres, em retrospectiva, especialmente o nome do parâmetro old-queue eu d sugiro nomeá-lo fila, como se refere a um átomo Você poderia Mesmo considerar nomear a função de média móvel - Você recebeu th É uma mensagem porque você está inscrito no grupo Grupos do Google Clojure Para postar neste grupo, envie um e-mail para email protegido Note que as postagens dos novos membros são. at 20 de julho de 2017 às 1 52 pm. In além de usar peek em vez de primeiro, Como indicado por Plinio, a função de média móvel acima usa alguns nomes pobres, em retrospectiva, especialmente o nome do parâmetro old-queue eu sugiro nomeá-lo fila, como ele se refere a um átomo Você poderia até considerar nomear a função moving-average. - Recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure Para publicar neste grupo, envie um e-mail para Nota que as mensagens dos novos membros são moderadas - por favor, tenha paciência com o seu primeiro post Para anular a subscrição deste grupo, envie um email para Clojure Para obter mais opções, visite este grupo em --- Você recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure Para cancelar a inscrição deste grupo e parar de receber e-mails dele, envie um e-mail para Mais opções, visite. Jony Hudson P Robably não a resposta que você está procurando, mas a média móvel ponderada exponencial não requer nenhum outro estado que não o valor atual defn ewma alpha fn avg novo - 1 alfa avg alfa novo Jony - Você recebeu esta mensagem porque você está inscrito para O grupo Grupos do Google Clojure Para postar neste grupo, envie e-mail para e-mail protegido Note que as postagens dos novos membros são moderadas - por favor, seja paciente com o seu primeiro post Para cancelar a sua inscrição neste grupo, envie. Por domingo, 20 julho 2017 12 48 19 UTC 1, Cecil Westerhof escreveu. ou existe uma maneira melhor. Probably não a resposta que você está procurando, mas a média móvel ponderada exponencial doesn t exigem qualquer estado diferente do valor atual. Você recebeu esta mensagem porque está inscrito no grupo Grupos do Google Clojure Para postar neste grupo, envie um e-mail para Note que as postagens de novos membros são moderadas - por favor, seja paciente with your first post To unsubscribe from this group, send email to clojure For more options, visit this group at --- You received this message because you are subscribed to the Google Groups Clojure group To unsubscribe from this group and stop receiving emails from it , send an email to For more options, visit.

No comments:

Post a Comment