2015-11-22 1 views
0

Я новичок в Haskell и до сих пор не понял, как сделать что-нибудь реалистичное. Я рассмотрел примеры повторных отношений, но реализация на данный момент слишком продвинута для меня.Рекуррентные отношения в haskell

Я пытаюсь установить рекуррентное соотношение:

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

, но я не могу понять, чтобы установить свои типы для ввода в е (а, б) или как определить его в целом ,

+0

Не могли бы вы рассказать о вычислении, которое вы пытаетесь реализовать? Каково повторение, что такое базовый случай и т. Д.? – LuxuryMode

+1

Помимо базового футляра, этот код выглядит хорошо. –

+1

из-за первого «f (t + 1, i + 1)», было бы очень сложно найти базовый случай, так как мне кажется, что оба аргумента/элемента будут неограниченно расти. – Carsten

ответ

2

Haskell определяет функции немного иначе, чем другие языки - вы не обертываете параметры в скобках, вместо этого они используются аналогично математике, где это означает «сделать этот бит первым». Таким образом, ваша функция будет выглядеть немного, как это в 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) 
+0

вы пробовали запустить это? скажем, с 'f 1 1'? (В GHCi это не займет много времени, чтобы переполнить стек) – Carsten

+0

Спасибо, @Carsten не с этими аргументами - я не знал, каковы были его условия, поэтому сделал что-то простое, чтобы проиллюстрировать идею - я обновил ответ сейчас иметь другое условие :) – Hamish