none
Entendendo parâmetros lambda de um delegate em uma função RRS feed

  • Pergunta

  • Tenho a função abaixo. Só gostaria de entender quem é X e que valores ele vai atingindo no decorrer da função. Não consegui pegar no debug. Não precisam dizer exata,ente os valores literalmente, mas como ele sendo aringido. Estou estudando e quero entender tudo isso.

    public int qualquerCoisa(int tamanho)
            {
                Func<int, int> calcFib = null;
    
                calcFib = x => (x - 1 + x - 2);
    
                return calcFib(tamanho);
            }

    Apenas uma ajuda. Usando uma lista para o Delegate(aprendi que isso se chama função linear, é isso mesmo?) eu decremento a lista para ela ir pegando os respectivos valores, mas não consigo fazer uma operação aritmética simples com "X", pois eu tenho uma lista e "X" passa ser essa lista, conforme Omni e ramaral me explicaram nos posts abaixo. Como eu faria isso? Estou testano fazer u fibonacci dessa forma. Antes que outro me passem outra solução, Fibonacci eu sei fazer. Quero tentar fazer da forma citada. Veja como ficou meu método. Sei que Fibonacci é: Fn = F(n-1) + F(n-2). O x - 1 e o x - 2 dá erro. Nesse caso o retorno da função seria uma lista(Fibonacci)

    List<int> lista = new List<int>();
    
                Func<List<int>, List<int>> calcFib = null;
    
                for(int i = 0; i <= tamanho-1; i++)
                    lista.Add(i);
    
                calcFib = x => x.Count == 0 ? 0 : (x - 1 + x - 2) + calcFib(x.Take(x.Count - 1).ToList<int>());
    
                return calcFib(lista);
    quinta-feira, 9 de julho de 2015 12:05

Respostas

  • Fiz de duas formas. 

    Não linear:

    public List<int> novoFibonacci(int tamanho) { List<int> lista = new List<int>(); for (int i = 0; i <= tamanho - 1; i++) { lista.Add(i); } //O Select executa GetFibonacciAt() passando a ela cada um dos elementos da lista, //returnado um IEnumerable<int> contendo cada um dos resultados. return lista.Select(n => GetFibonacciAt(n)).ToList(); }

    public int getFibonacci(int tamanho)
            {
                if (tamanho == 0)
                    return tamanho;

                int a = 0;
                int b = 1;
                for (int i = 0; i < tamanho; i++ )
                {
                    int x = a;
                    a = b;
                    b = x + b;
                }

                    return a;
            }

    E linear:

    public List<int> novoFibonacci(int tamanho)
    {
        Func<int, int> getFibonacciAt = null;
        getFibonacciAt = n => (n <= 1) ? n : getFibonacciAt(n - 1) + getFibonacciAt(n - 2);
    
        var lista = new List<int>();
        for (int i = 0; i <= tamanho - 1; i++)
        {
            lista.Add(i);
        }
        return lista.Select(n => getFibonacciAt(n)).ToList();
    }

    • Marcado como Resposta pnet quinta-feira, 9 de julho de 2015 20:47
    quinta-feira, 9 de julho de 2015 20:46