kpug / fpij

functional programming in java
0 stars 0 forks source link

What's the difference between recursion and corecursion? #6

Open jayden-17 opened 7 years ago

jayden-17 commented 7 years ago
In recursion as well as corecursion, evaluation of one step is dependent on the previous step. But a recursive definition starts with the last step and defines its relationship with the preceding one. In order to be able to conclude, it also has to define the base step. 
Corecursion, on the other hand, starts from the first step and defines its relationship to the next one. There’s no need for a base step, because it’s also the first step

RecursionCorecursion 에 대해 알 것 같기도 ... 모르는 것 같기도 ...

before30 commented 7 years ago

fold left와 fold right

pr-lawrence commented 7 years ago

In recursion as well as corecursion, evaluation of one step is dependent on the previous step. But a recursive definition starts with the last step and defines its relationship with the preceding one. In order to be able to conclude, it also has to define the base step. Corecursion, on the other hand, starts from the first step and defines its relationship to the next one. There’s no need for a base step, because it’s also the first step

리커전과 코리커전에서 한 단계의 평가는 다음 단계에 의존적이다. 그러나 리커전 정의는 마지막 단계에서 시작하는 것이며, 이들의 관계는 선행하는 단계에 대해 정의한다. 또한 결론을 내리기 위해 기본 단계가 정의되어야 한다. 반면에 코리커전은 처음 단계에서 시작하여 다음 단계로 관계를 정의한다. 기본 과정이 필요하지 않으며, 기본과정이 처음 단계이기 때문이다.

Recursion (재귀)

재귀라 함은 자기 자신을 다시 부르는 것을 이야기 한다. 따라서 아래와 같은 코드가 될 것이다.

public Integer functionA(List<Integer> list) {
    ...
    return functionA(list.tail());
}

이렇게 호출하는 경우, 함수의 호출될 때마다 콜 스택이 증가 하게 되는 단점이 있지만, 계산이 편리해 지는 경우가 있다. 예를 들어 피보나치 수열의 경우를 들 수 있다.

리커전을 foldRight로 생각할 수 있으며, 모든 수식이 전개되어야만 계산이 진행되기 때문이다.

Corecursion (반복? 공회기?)

코리커전의 경우는 재귀와 반대의 반복이며, 흔히 사용하는 구문중 for, while 표현식으로 생각할 수 있다. 수식의 진행이 컬렉션의 순차적으로 이루어지기 때문에 초기 값을 알 필요 없으며, 되돌아와야 하는 기본 단계 또한 없다.

for(int i = 0; i < list.size() ; i++ ) {
    ....
}

코 리커전의 경우 foldLeft로 생각할 수 있으며, 수식은 순차적으로 진행되기 때문에 되돌아 와야할 기본단계가 없다.

pr-lawrence commented 7 years ago

haskell 논란의 코드

foldr (&&) True (repeat False)
foldl (&&) True (repeat False)