【问题标题】:good stream definition (mathematical project)良好的流定义(数学项目)
【发布时间】:2013-10-11 23:39:47
【问题描述】:

我想计算这个套件:

h(-2)=0
h(-1)=1
h(i)=a(i)*h(i-1)+h(i-2), for i>=0

(a 已给出;对于我的测试,我使用 a=(1,1,2),它只有 3 个术语)

我认为最好的方法是使用流,所以我写道:

val h:Stream[Int]=0#::1#::(h.zipWithIndex.zip(h.tail).zip(h.tail.tail)).map{case(((a,i),b),c)=>{
    liste_a(i-2)*b+a
}}
def h2(i:Int)=h(i+2)

但我有一个...堆栈溢出错误,我不知道它来自哪里。

【问题讨论】:

    标签: scala stream


    【解决方案1】:

    由于以下原因导致堆栈溢出:h.tail.tail。这将尝试计算h 的第三个元素(因为流的head 是严格的),并且计算需要使用h.tail.tail 的表达式,从而导致无限循环。

    【讨论】:

    • 我认为堆栈溢出是因为递归中没有终止条件。如果有,您的解释将适用于为什么有一个参数超出了堆栈溢出开始发生的原因。
    • @RandallSchulz Nah,您可以像这样定义斐波那契,而无需终止条件。这里:val fib: Stream[Int] = 1 #:: 1 #:: ((fib zip fib.tail) map { case (a, b) => a + b }).
    • @Daniel ,嗨,我没听懂你的意思,我看不出工作 fib.tail 和错误的 h.tail.tail 之间的区别。另外,您能解释一下如何避免此错误吗?
    • 好的,我明白了;我的定义至少需要 3 个初始值(例如 0 #:: 1 #:: 2 #:: 等...)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2011-05-14
    • 2011-08-08
    • 2010-10-18
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多