골프 고정 점 결합기


9

선택한 언어로 가능한 적은 문자로 고정 소수점 조합 을 작성 하십시오.

  • 자유 형식 ( , 가장 짧은 것) : 전체 프로그램, 실제 기능, 코드 스 니펫
  • 표준 라이브러리가 있으면 표준 라이브러리를 사용할 수 없습니다
  • 그러나 다른 고급 기능에서 추출 할 수 있습니다.베이스에서 구성하는 것보다 오히려 수행하십시오.

데모로 사용하는 재귀 요인 또는 피보나치를 포함하십시오.

이 질문에서, 자기 참조는 용인 될 수 있으며, 목적은 적용 할 재귀 함수에서이를 제거하는 것입니다.


게으른 언어 구현은 괜찮습니까? (당신이 수락 하시겠습니까 (define Y(lambda(f)(f(Y f))))?)
Eelvex

요청 된 예제 중 하나를 사용하여 설명 할 수있는 구현은 괜찮습니다.
JB

1
내가 틀리지 않고 엄격하게 말하면, "Y 결합기"라는 용어는 구체적으로 Haskell Curry, λf. (λx.f (xx)) (λx.f (xx))에 의해 발견 된 단일 고정 점 결합기를 나타냅니다.
Joey Adams

@ Elvex : 지금까지 두 답변 (OP의 답변 포함)이 부정 행위를 사용하므로 괜찮습니다. :-P 개인적으로 @Joey의 접근 방식을 사용하고 실제 (자기 참조가 아닌) Y 결합기 만 할 것이라고 말합니다. ;-)
Chris Jester-Young

@Chris : 오 마이. 그것이 내가 처음에 생각했던 것입니다. 그리고 나는 ... 길을 잃었습니다. 지금 변경하기에는 너무 늦었습니다. 우리는 또 다른 질문을 열어야합니다.
JB

답변:


13

하스켈 : 10 자

y f=f$y f

계승 또는 n- 피보나치의 재귀 정의를 작성하는 데 사용하는 예 :

> map ( y(\f n->if n <= 1 then 1 else n*f(n-1)) ) [1..10]
[1,2,6,24,120,720,5040,40320,362880,3628800]

> map ( y(\f n->if n <= 1 then 1 else f(n-1)+f(n-2)) ) [0..10]
[1,1,2,3,5,8,13,21,34,55,89]

그러나보다 일반적인 사용 방법 y은 함수가 아닌 이러한 시퀀스를 직접 생성하는 것입니다.

> take 10 $ y(\p->1:zipWith (*) [2..] p)
[1,2,6,24,120,720,5040,40320,362880,3628800]

> take 11 $ y(\f->1:1:zipWith (+) f (tail f))
[1,1,2,3,5,8,13,21,34,55,89]

물론 Haskell을 사용하면 배럴에서 물고기를 쏘는 것과 비슷합니다! Data.Function라이브러리라는이 기능을 가지고 fix더 자세하게 다소 구현 불구하고.


4

펄, 37

sub f{my$s=$_[0];sub{$s->(f($s),@_)}}

요인 시연 :

sub fact {
  my ($r, $n) = @_;
  return 1 if $n < 2;
  return $n * $r->($n-1);
}
print "Factorial $_ is ", f(\&fact)->($_), "\n" for 0..10;

피보나치 데모 :

sub fib {
  my ($r, $n) = @_;
  return 1 if $n < 2;
  return $r->($n-1) + $r->($n-2);
}
print "Fibonacci number $_ is ", f(\&fib)->($_), "\n" for 0..10;

3

GNU C-89 자

#define fix(f,z)({typeof(f)__f=(f);typeof(__f(0,z))x(typeof(z)n){return __f(x,n);}x(z);})

예:

#define lambda2(arg1, arg2, expr) ({arg1;arg2;typeof(expr)__f(arg1,arg2){return(expr);};__f;})

int main(void)
{
    /* 3628800 */
    printf("%ld\n", fix(lambda2(
        long factorial(int n), int n, 
            n < 2 ? 1 : n * factorial(n-1)
        ), 10));

    /* 89 */
    printf("%ld\n", fix(lambda2(
        long fibonacci(int n), int n, 
            n < 2 ? 1 : fibonacci(n-1) + fibonacci(n-2)
        ), 10));

    return 0;
}

1

k2, 12 자

명백한 자기 참조 구현이 가장 짧습니다. 이것은 좋은 언어 디자인의 표시입니다. 불행히도 K는 게으르지 않으므로 값별 통화 만 관리 할 수 ​​있습니다.

Y:{x[Y[x]]y}

이 예제는 k4와 q에서도 문제없이 작동하지만 아래 예제에서는 k2를 가정합니다.

  Y:{x[Y[x]]y}
  fac: {[f;arg] :[arg>0; arg*f[arg-1]; 1]}
  Y[fac] 5
120
  fib: {[f;arg] :[arg>1; f[arg-1] + f[arg-2]; arg]}
  Y[fib]' !10
0 1 1 2 3 5 8 13 21 34

좀 더 겸손한 18 자로 (λx. x x) (λxyz. y (x x y) z)K를 정확하게 표기 할 수 있습니다 .

{x[x]}{y[x[x;y]]z}

아마 언젠가 (k7?), 이처럼 보일 수 Y:{x Y x}있습니다.


0

파이썬 3, 30 바이트

Y=lambda f:lambda a:f(Y(f))(a)

데모 :

Y=lambda f:lambda a:f(Y(f))(a)
quicksort = Y(
lambda f:
    lambda x: (
        f([item for item in x if item < x[0]])
        + [y for y in x if x[0] == y]
        + f([item for item in x if item > x[0]])
    ) if x
    else []
)
print(quicksort([1, 3, 5, 4, 1, 3, 2]))

크레딧 : https://gist.github.com/WoLpH/17552c9508753044e44f


파이썬 3에는 필터가 있습니다. 또한 그 의견을 농담으로 표시하지
않아서

파이썬 3의 필터는 목록이 아닌 필터 객체를 반환합니다. 필터를 사용하는 것은 읽기 어렵거나 파이썬이 적습니다.
Labo

그것은 수 적은 파이썬하지만, 더 라인이었다 것이다 기능 프로그래밍 내 시점이었다
Cyoce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.