【问题标题】:Recurrence relations in haskellhaskell中的递归关系
【发布时间】:2015-11-22 04:09:05
【问题描述】:

我是 Haskell 的新手,还没有弄清楚如何做任何现实的事情。 我查看了递归关系的示例,但目前对我来说实施太先进了。

我正在尝试设置循环关系:

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

但我不知道如何将输入的类型设置为 f(a,b) 或如何定义它。

【问题讨论】:

  • 您能描述一下您要实现的计算吗?什么是复发,什么是基本情况等?
  • 除了基本情况之外,该代码对我来说看起来不错。
  • 由于第一个 f (t+1,i+1) 可能真的很难找到一个基本案例,因为在我看来这两个参数/项目都会无限增长
  • 我要解决的问题是统计类:“假设我们玩一个游戏,在每个阶段我们可以以 4/6 的概率赢一美元,以 2 的概率输一美元/6. 我们从 4 美元开始,如果我们输掉了所有的钱,我们就必须停止游戏。在时间 t = 8 之前达到 6 美元水平的概率是多少?我的基本情况是:f(8,_) = 0f(_,6)=1 问题的答案是f(0,2)

标签: haskell recurrence


【解决方案1】:

Haskell 对函数的定义与其他语言略有不同——您不会将参数括在括号中,而是以与数学类似的方式使用它们,即“先做这件事”。所以你的函数在haskell中看起来有点像这样,你只需要在函数名和变量之间有一个空格

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

另外,为了防止无限循环,创建递归结束的条件很重要,例如,如果你只想在 i 为零时返回 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)

【讨论】:

  • 你试过运行这个吗?比方说f 1 1? (在 GHCi 中溢出堆栈不会花费很长时间)
  • 谢谢,@Carsten 没有那些参数 - 我不知道他的条件是什么,所以做了一些简单的事情来说明这个想法 - 我现在已经更新了答案以获得另一个条件:)
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2019-10-18
  • 2015-03-08
  • 2020-11-09
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多