Pergunta

Estou brincando com o LINQ e assuntos relacionados e estava me perguntando sobre o seguinte.

Eu tenho 2 métodos para obter uma sequência de Fibonacci. Comecei com:

public static IEnumerable<int> Fibonacci
    {
        get
        {
            int i = 0;
            int j = 1;
            int temp = 0;

            while (true)
            {
                yield return i;

                temp = i;
                i = j;
                j = temp + i;
            }
        }
    }  

Mas isso me fez pensar, por que eu escolheria isso:

public static IList<int> Fibonacci(long to)
    {            
        IList<int> fibList = new List<int>();
        int i = 0;
        int j = 1;
        int temp, index = 0;

        while (index < to)
        {
            fibList.Add(i);

            temp = i;
            i = j;
            j = temp + i;

            index++;
        }
        return fibList;
    }

Ilist é um enumerável também + posso querer adicionar alguma parametrização a ele. Não estou realmente procurando otimizações ou coisas ou coisas como usar <long> porque o número fica grande rápido, é apenas um exemplo rápido. Apenas alguns argumentos pro e a cada método. Por que e quando devo usar qual método?

Foi útil?

Solução

Uma diferença importante entre os dois é que, com sua segunda versão, você deve saber com antecedência quando deseja parar, mas na primeira versão você pode começar a iterando e depois decidir quando parar. Você não precisa saber com antecedência.

Você também não precisa armazenar a lista inteira na memória de uma só vez com a primeira versão. Você pode lidar com os dados de maneira a transmitir.

Uma vantagem do segundo é que o retorno de uma lista permite indexar na matriz, em vez de lidar com elementos um por um desde o início. Você pode usar a segunda versão se souber quantos elementos deseja e souber que a lista é pequena o suficiente para caber na memória.

Observe que essas diferenças não têm nada a ver com você usar uma propriedade ou uma chamada de função. Você pode reescrever o primeiro a ser uma chamada de função que não usa parâmetros.

Se você tiver apenas a primeira versão disponível, poderá imitar facilmente a segunda versão usando Fibinocci().Take(20).ToList().

Outras dicas

Por que você usaria uma propriedade (estática ou não). Um número de fibonacci gera é uma propriedade de quê ...? Além disso, como regra geral, uma propriedade nunca deve executar nenhum cálculo/processamento "significativo"; portanto, você definitivamente deseja usar uma função aqui.

Se você colocar a primeira versão em um foreach Em seguida, ele nunca terá rescisão, a menos que você se divirta especificamente. Fonte potencial para um bug ao usá -lo. Talvez seja isso que você quer, mas é algo para ser cauteloso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top