Итак, в последнее время я немного возился с Python и пытаюсь найти способ вывести n-е число последовательности Фибоначчи в одном выражении. Это код, который я написал до сих пор:
(lambda f: f if f<2 else (f-1)+(f-2))(n)
# n == 1 -> 1
# n == 2 -> 1
# n == 3 -> 3
# n == 4 -> 5
# n == 5 -> 7
....
Однако, как я прокомментировал выше, это просто выводит набор нечетных чисел. Я не понимаю, почему это происходит, потому что, если я переписываю это как именованную лямбда-функцию, это будет выглядеть примерно так:
f = lambda n: n if n<2 else f(f-1)+f(f-2)
# f(1) -> 1
# f(2) -> 1
# f(3) -> 2
# f(4) -> 3
...
# f(10) -> 55
...
Причина, по которой я добавил тег Lambda Calculus, заключается в том, что я не уверен, попадает ли этот вопрос в область простого понимания того, как Python справляется с этим. Я немного прочитал о комбинаторе Y в лямбда-исчислении, но это для меня чужой язык, и я не мог извлечь ничего из ресурсов, которые я нашел для этого, о лямбда-исчислении.
Причина, по которой я пытаюсь сделать это в одной строке кода, а не называть ее, заключается в том, что я хочу попытаться поместить эту лямбда-функцию в понимание списка. Так что сделайте что-нибудь вроде этого:
[(lambda f: f if f<2 else (f-1)+(f-2))(n) for n in range(10)]
и создайте массив из первых x чисел в последовательности Фибоначчи.
Я ищу способ сделать все это в одном выражении, и если это попадет в область лямбда-исчисления, что, как я полагаю, так и есть, чтобы кто-то объяснил, как это будет работать.
Не стесняйтесь предлагать ответ на JavaScript, C # или других языках типа C, которые поддерживают лямбда-функции.
РЕДАКТИРОВАТЬ: Я нашел решение того, что пытался сделать:
[(lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))(lambda f:(lambda n: n if n<2 else f(n-1)+f(n-2)))(y) for y in range(10)]
Я знаю, что это совершенно непрактично, и этот метод никогда не следует использовать, но я был обеспокоен тем, МОГУ ли я делать это, а не ДОЛЖЕН ли я когда-либо это делать.
x
, для которого вы бы это использовали? 10? 100? 1000? 1,000,000? - person lehiester   schedule 30.09.2017(lambda __g, __print: [(__print([fib(x) for __g['x'] in range(10)]), None)[1] for __g['fib'], fib.__name__ in [(lambda n: (lambda __l: [(1 if (__l['n'] < 2) else (fib((__l['n'] - 1)) + fib((__l['n'] - 2)))) for __l['n'] in [(n)]][0])({}), 'fib')]][0])(globals(), __import__('__builtin__').__dict__['print'])
- person Rob Kennedy   schedule 30.09.2017