#include <iostream>
using namespace std;
int main()
{
int num1 = 0;
int num2 = 1;
int num_temp;
int num_next = 1;
int n;
cin >> n;
for (int i = 0; i < n; i++){
cout << num_next << " ";
num_next = num1 + num2;
num1 = num2;
num_temp = num2;
num2 = num_next - num1;
num1 = num_temp;
}
return 0;
}
最初の「n」フィボナッチ数を出力する必要がありますが、ロジックに問題があると思います。何が間違っているのかわかりません。最初の3つまたは4つの要素は正しいですが、問題が発生します...
期待:
ために n=9
0、1、1、2、3、5、8、13、21
実際:
1 1 1 1 1 1 1 1 1
#include <iostream>
using namespace std;
int main()
{
int num1 = 0;
int num2 = 1;
int num_temp;
int num_next = 1;
int n;
cin >> n;
if (n>=1)
cout << 0 << " ";
if (n>=2)
cout << 1 << " ";
for (int i = 0; i < n-2; i++){
num_next = num1 + num2;
cout << num_next << " ";
num1 = num2;
num2 = num_next;
}
cout << endl;
return 0;
}
代わりにこれを試してください。それは少し異なるテイクですが、まったく同じようにそこに到達します。
#include <iostream>
using namespace std;
int main()
{
int input(0), Alpha(0), Beta(1), Total(1);
cout << "Please input a top number: ";
cin >> input;
for(int i = 0; i <= input; i++)
{
cout << Total << endl;
Total = Alpha + Beta;
Alpha = Beta;
Beta = Total;
}
}
フィボナッチ数列は{0、1、1、2、3、... N-1、N、2N-1}です。
これを実装するには、N = (N - 2) + (N - 1)
を計算できるように、N - 2
変数とN - 1
変数が必要です。
unsigned int count = 0;
std::cin >> count;
// assume count >= 2
unsigned int prev2 = 0;
unsigned int prev1 = 1;
std::cout << prev2 << " " << prev1 << " ";
for (unsigned int i = 2; i < count; ++i)
{
unsigned int current = prev2 + prev1;
prev2 = prev1;
std::cout << current << " ";
prev1 = current;
}
std::cout << std::endl;
これは私のバージョンです。
以前のサンプルとほぼ同じですが、リングバッファの使用法を示したかったのです。
// Study for algorithm that counts n:th fibonacci number
// Fibonacci[1] == 1 and Fibonacci[2] == 1 (and Fibonacci[0] == 0)
// Fibonacci[n] = Fibonacci[n-1] + Fibonacci[n-2]
#include <cstdio>
#include <iostream>
#include <cstdlib>
int main(int argc, const char* argv[])
{
// not counting trivial Fibonacci[0]
if(argc != 2 || atoi(argv[1]) < 1){
std::cout << "You must provide one argument. Integer > 0" << std::endl;
return EXIT_SUCCESS;
}
// ring buffer to store previous two fibonacci numbers, index it with [i%2]
// seeded with Fibonacci[1] and Fibonacci[2]
// if you want to count really big fibonacci numbers, you have to make your own type for
// buffer variable
// this type overflows after [93] with my macbook
unsigned long long int buffer[2]={ 1, 1 };
// n:th Fibonacci
unsigned int fn = atoi(argv[1]);
// count loop is used if seeked fibonacci number is gt 2
if(fn > 2){
for(unsigned int i = 2; i < fn; ++i){
buffer[i%2] = buffer[(i-1)%2] + buffer[(i-2)%2];
}
}
// Result will be send to cout
std::cout << "Fibonacci[" << fn << "] is " << buffer[(fn-1)%2] << std::endl;
return EXIT_SUCCESS;
}
もちろん、スタックオーバーフローは再帰バージョンの制限です。それが問題にならない場合は、再帰的フィボナッチのテンプレートバージョンを検討することもできます。
#include <iostream>
template <int N> int Fib(){ return Fib<N-1>() + Fib<N-2>(); }
template <> int Fib<1>() { return 1; }
template <> int Fib<0>() { return 1; }
using namespace std;
int main()
{
// For the 10th Fibbonacci number...
cout << Fib<10>() << endl;
return 0;
}
#include <iostream>
using std::cout; using std::cin;
int main()
{
unsigned int a=0u, b=1u, n;//assuming n is a positive number.
//otherwise make it int instead of unsigned
//and check if it's negative
cin >> n;
if(n==0)
{return 0;}
if(n==1)
{cout << a; return 0;}
cout << a << " " << b << " ";
for(unsigned int i=2u ; i<n; i++)
{
b = a + b;
a = b - a;
cout << b << " ";
}
return 0;
}
最後の2つの値を合計することにより、次の値を「b」に入れます。次に、「a」は前のb値を取得します。 a = 3およびb = 5と仮定すると、新しいbは8になり、「a」は5になります。これは、常に最後の2つの数値を合計して、次の数値の結果を取得するためです。次の操作は、5(現在のa)と8(現在のb)を合計します。
#include<iostream.h>
#include<conio.h>
void main()
{
clrscr();
int arr[50],n,i;
cout<<"Enter the no. of elements to be printed in fibonacci series : ";
cin>>n;
arr[0]=0;arr[1]=1;
for(i=2;i<n;i++)
{
arr[i]=arr[i-1]+arr[i-2];
}
cout<<"\nThe fibonacii series is : "<<endl;
for(i=0;i<n;i++)
{
cout<<arr[i]<<"\t";
}
getch();
}
#include <iostream>
using namespace std;
int main()
{
int num1 = 0, num2 = 1 , num_next = 1, n;
cout << "enter a number: \n";
cin >> n;
//for when a negative value is given
while(n < 0)
{
cout << "ERROR\n";
cin >> n;
}
//when any positive number (above 1 is given)
if (n > 0)
{
//to give the value of 0 without ruining the loop
cout << num1 << " ";
for (int i = 0; i < n; i++)
{
//the Fibonacci loop
cout << num_next << " ";
num_next = num1 + num2;
num1 = num2;
num2 = num_next;
}
}
//for when 0 is the given value
else if (n == 0)
cout << n << " ";
return 0;
}
/* Author: Eric Gitangu
Date: 07/29/2015
This program spits out the fibionacci sequence for the range of 32-bit numbers
Assumption: all values are +ve ; unsigned int works here
*/
#include <iostream>
#include <math.h>
#define N pow(2.0,31.0)
using namespace std;
void fibionacci(unsigned int &fib, unsigned int &prevfib){
int temp = prevfib;
prevfib = fib;
fib += temp;
}
void main(){
int count = 0;
unsigned int fib = 0u, prev = 1u;
while(fib < N){
if( fib ==0 ){
fib = 0;
cout<<" "<< fib++ <<" \n ";
continue;
}
if( fib == 1 && count++ < 2 ){
fib = 1;
cout<< fib <<" \n ";
continue;
}
fibionacci(fib, prev);
cout<< fib <<" \n ";
}
}
だから...ここに「Fibの特定のシーケンスが必要な場合」の解決策があります。
#include <iostream>
using namespace std;
int fibonacciSeq(int k)
{
int num1=1;
int num2=1;
int count;
for(int i=0; i<k; i++)
{
if(i==1)
count=1;
else
{
count=num1+num2;
num1=num2;
num2=count;
}
}
return count;
}
一時変数を使用しないソリューションは次のとおりです。
#include <iostream>
using namespace std;
int main()
{
int n0 = 0;
int n1 = 1;
int n;
cout << "Prints first N in Fibonacci series. Please enter a number for N: ";
cin >> n;
for(int i = 0; i < n; i++) {
cout << n0 << " ";
n1 = n0 + n1;
n0 = n1 - n0;
}
}
また、(末尾)再帰的ソリューション:
#include <iostream>
using namespace std;
void fib(int n, int n0, int n1) {
if(n <= 0) {
return;
} else {
cout << n0 << " ";
fib(n-1, n1, n0 + n1);
}
}
int main()
{
int n;
cout << "Prints first N in Fibonacci series. Please enter a number for N: ";
cin >> n;
fib(n, 0, 1);
}
さて、私は同じタスクを実行するための再帰的な解決策を探していました。ほとんどの場合、人々はn番目のフィボナッチ数を見つけるための再帰関数を記述し、メインプログラムでn回ループを実行し、これを再帰的に呼び出します。値1からnで関数を使用して、n個のフィボナッチ数をすべて取得して出力します。これは大きなオーバーヘッドです。
これは同じタスクを実行するソリューションですが、再帰関数を1回だけ呼び出して、最大n個のフィボナッチ数をすべて取得し、それらを配列に格納してから出力します。これは、前に述べたものより((n-1)*(再帰呼び出しのオーバーヘッド))倍高速です。あなたがそれが助けになると思うなら親指を立ててください:)
#include<iostream>
using namespace std;
int *arr;
int iter = 0;
int len;
int returnValue;
void exist(int num, int arr[] ) /* this function checks if the Fibonacci number that recursive function have calcuated is already in the array or not, mean if it is already calculated by some other recursive call*/
{
bool checkExistance = false; /* if this is true, means this Fibonacci number is already calculated and saved in array, so do not save it again*/
returnValue = num;
for (int i = 0; i< len; i++)
{
if(arr[i]==num)
{
checkExistance = true;
break;
}
}
if(!checkExistance)
{
arr[iter]=num;
iter++;
}
}
int fibonacci(int n)
{
if (n==1)
{
exist(1,arr);
return 1;
}
else if (n==2)
{
exist(1,arr);
return 1;
}
else
{
exist((fibonacci(n-1)+fibonacci(n-2)),arr);
return returnValue;
}
}
int main()
{
int n;
cout<<"Enter the number of Fibonacci you want to print: ";
cin>>n;
len = n;
arr = new int[n];
fibonacci(n);
arr[n-1] = 1;
cout<<"1:\t"<<arr[n-1]<<endl;
for (int i = 0; i< len-1; i++)
{
cout<<i+2<<":\t"<<arr[i]<<endl;
}
return 0;
}
0と1を出力するif-elseステートメントを回避し、ループ外での出力を回避し、「temp」整数を回避するフィボナッチ数列を生成するコードを記述できます。 'first'変数と 'second'変数を-1と1で初期化することでそれを行うことができるので、それらの間の合計は、シリーズの最初のオルガンである0を与え、ループは残りの仕事をします。
#include <iostream>
using namespace std;
int main()
{
int num, a = -1, b = 1;
cout << "enter a number:" << endl;
cin >> num;
for (int i = 0 ; i <= num ; i++ )
{
b += a;
cout << b << " ";
a = b - a;
}
cout << endl;
return 0;
}
再帰的な解決策をもう一度見てみませんか。
void fibonacci(int n1, int n2, int numCount)
{
--numCount;
if (numCount > 0)
{
cout << n1 << ", ";
fibonacci(n2, n1 + n2, numCount);
}
else
cout << n1 << endl;
}
次に、それを呼び出すことができます:
enterint fNum;
cout << "Enter a non negative number to print output fibonacci sequence: ";
cin >> fNum;
fibonacci(0, 1, fNum);
出力の例:
簡潔なバージョン:
int n, a{0}, b{1};
std::cin >> n;
while (n-- > 0) {
std::cout << a << " ";
std::tie(a, b) = std::make_Tuple(b, a + b);
}