/ / Рецидивні відносини в haskell - haskell, рецидиви

Рекурентні відносини в Haskell - haskell, recurrence

Я новачок у Haskell і досі не зрозумів, як зробити щось реалістичне. Я переглянув приклади рецидивів, але реалізація для мене занадто передова.

Я намагаюся встановити відношення рецидивів:

f(t,i) = (2/3)*f(t+1,i+1) + (1/3)*f(t+1,i-1)

але я не можу розібратися, щоб встановити свої типи вхідних даних на f (a, b) або як визначити це взагалі.

Відповіді:

2 для відповіді № 1

Хаскелл визначає функції дещо інакшез інших мов - ви не "загортаєте" параметри в дужки, замість цього вони використовуються аналогічно математиці, де це означає "зробіть цей біт спочатку". Таким чином, ваша функція буде виглядати приблизно так, як у haskell, де вам просто потрібен простір між назвою функції та вашими змінними

f t i = (2/3) * f (t+1) (i+1) + (1/3) * f (t+1) (i-1)

Також для запобігання нескінченного циклу важливови створюєте умову, щоб рекурсія закінчилася, наприклад, якщо ви просто хочете повернути t, коли я дорівнює нулю, ви можете це зробити (це здогадка, я "не впевнений, що вам подобається, щоб ваш стан був, ви можете мати більше одного)

f t 0 = t
f 10 _ = 10
f t i = (2/3) * f (t+1) (i+1) + (1/3) * f (t+1) (i-1)

Також вважається хорошою практикою додавати тип функції (зазвичай я б це робив як перший мій крок)

f :: Float -> Float -> Float
f t 0 = t
f 10 _ = 10
f t i = (2/3) * f (t+1) (i+1) + (1/3) * f (t+1) (i-1)