내친 김에, 일반항으로 정의한 수열이 아니고, 귀납적으로 정의된 수열의 경우도 해봅시다.
대표적인 예가 피보나치 수열이지요.
Q2) f(0) = f(1) = 0, f(n + 2) = f(n + 1) + f(n) 로 나타내어지는 피보나치 수열의
12개 항을 출력하고, 각 항의 비 f(n + 1)/f(n)도 출력하여라.
A) 역시 Q1과 거의 동일한 방식으로 작성하면 됩니다.
또한 각 항의 비를 출력하는 것은 adjacent_difference 알고리듬을 사용하면 간단합니다.
//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
#include <iterator>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
//---------------------------------------------------------------------------
using namespace std;
class Fibonacci: public unary_function<double, double>
{
public:
Fibonacci(double n_0, double n_1):
n0(n_0), n1(n_1), n(0) {}
double operator()()
{
n = n0 + n1; n0 = n1; n1 = n;
return n;
}
private:
double n0, n1, n;
};
int main()
{
const int num_terms = 12;
vector<double> Fibonacci_series(num_terms);
Fibonacci_series[0] = 1; Fibonacci_series[1] = 1;
generate(Fibonacci_series.begin() + 2, Fibonacci_series.end(),
Fibonacci(Fibonacci_series[0], Fibonacci_series[1]));
ostream_iterator<double> out(cout, " ");
copy(Fibonacci_series.begin(), Fibonacci_series.end(), out);
cout << endl;
adjacent_difference(Fibonacci_series.begin(), Fibonacci_series.end(), out,
divides<double>());
cout << endl;
return 0;
}
//---------------------------------------------------------------------------
실행 결과는 다음과 같습니다.
1 1 2 3 5 8 13 21 34 55 89 144
1 1 2 1.5 1.66667 1.6 1.625 1.61538 1.61905 1.61765 1.61818 1.61798
참고로, 피보나치 수열의 각 항의 비는 황금비인 (1 + √5) / 2 ≒ 1.618 에 수렴하는 것을 눈으로 볼 수 있지요.
|