如何解决递归序列a(n)= - a(n-1)+ n-1? 我尝试了向前和向后的迭代,但是没有能够获得(n)的显式解决方案。
答案 0 :(得分:0)
您的第一步应该是写出结果表
f(n)=x
n | x
-----
0 | 7
1 | -7 (-7 + 1 - 1)
2 | 8 ( 7 + 2 - 1)
3 | -6 (-8 + 3 - 1)
4 | 9 ( 6 + 4 - 1)
5 | -5 (-9 + 5 - 1)
6 | 10 ( 5 + 6 - 1)
7 | -4 (-10 + 7 - 1)
8 | 11 ( 4 + 8 - 1)
9 | -3 (-11 + 9 - 1)
你应该看到一种模式出现。每对解决方案[(0, 1), (2, 3), (4, 5), ...]
的差异为14,从(7, -7)
开始,每两个点n
递增一个。我们可以概括一下:
f(0) = 7
f(n) = 7 + k - 14 * b
where k is the increment value (each 1 k per 2 n)
b is 1 when n is odd, else 0.
现在我们只需要根据k
定义b
和n
。 k
不应该太难,让我们看看:
n | k
0 | 0
1 | 0
2 | 1
3 | 1
这会让你想起什么吗?这是一个内在的div2。
7 + (n // 2) - 14 * b
现在为b
n | b
0 | 0
1 | 1
2 | 0
3 | 1
对我来说看起来像mod 2
!模数是除法问题的剩余部分,是检查数字是偶数还是奇数的好方法。我们也在寻找简单的模数,因为当b==1
为奇数时我们需要n
,反之亦然。
f(0) = 7
f(n) = 7 + (n // 2) - 14 * (n%2)
where (//) is the floor division function
(%) is the modulo function
现在我们可以把它们放在一个函数中。在Go中这是:
func f(n int) int {
return 7 + n/2 - 14 * (n % 2)
}
在Python中它是
def f(n):
return 7 + n//2 - 14 * (n%2)
在Haskell,我们已经
了f :: Int -> Int
f n = 7 + n `div` 2 - 14 * (n `mod` 2)
或者,因为Haskell非常好地实现递归,所以简单地......
f :: Int -> Int
f 0 = 7
f n = f (n-1) + n - 1