你必须通过唯一的州,所以
Tuple{I, I} where {I}
不
Tuple{I, Tuple{I, I}} where {I}
iter.s0
).
因此,您可以定义
iterate
功能是:
iterate(iter::FibonacciIterable, state=(iter.s1-iter.s0, iter.s0)) =
state[2], (state[2], sum(state))
julia> for F in FibonacciIterable(BigInt(0), BigInt(1))
println(F)
F > 10 && break
end
0
1
1
2
3
5
8
13
编辑
:参考您的附加问题。
如果将定义更改为:
iterate(iter::FibonacciIterable, state=(iter.s1, iter.s0)) = state[2],
(state[2], sum(state))
julia> for F in FibonacciIterable(BigInt(2), BigInt(3))
println(F)
F > 10 && break
end
2
5
7
12
我们清楚地看到出了问题。
(fibonacci(n), fibonacci(n+1)
i、 e.先到元素
n
第二个是元素
n+1
.
iterate(iter::FibonacciIterable, state=(iter.s1-iter.s0, iter.s0)) =
state[2], (state[2], sum(state))
让我们看看当我们运行这些行时会发生什么:
julia> iterate(FibonacciIterable(BigInt(2), BigInt(3)))
(2, (2, 3))
julia> iterate(FibonacciIterable(BigInt(2), BigInt(3)), (2, 3))
(3, (3, 5))
julia> iterate(FibonacciIterable(BigInt(2), BigInt(3)), (3, 5))
(5, (5, 8))
迭代
告诉你第一个元素是
2
(2,3)
. 所以在第二行,我们使用这个状态来获得下一个迭代:value
3
下一个州
(3,5)
. 我们继续使用这个新状态来获取下一个值
5
(5,8)
.
我想在这个例子中混淆的是状态是一个元组,但是
迭代
struct FiboState{I}
a::I
b::I
end
以及以下定义
迭代
iterate(iter::FibonacciIterable, state=FiboState(iter.s1-iter.s0, iter.s0)) =
state.b, FiboState(state.b, state.a+state.b)
现在我们清楚地看到了发生了什么:
julia> iterate(FibonacciIterable(BigInt(2), BigInt(3)))
(2, FiboState{BigInt}(2, 3))
julia> iterate(FibonacciIterable(BigInt(2), BigInt(3)), FiboState{BigInt}(2, 3))
(3, FiboState{BigInt}(3, 5))
julia> iterate(FibonacciIterable(BigInt(2), BigInt(3)), FiboState{BigInt}(3, 5))
(5, FiboState{BigInt}(5, 8))
我希望这能有帮助。