斐波那契数列
Fibonacci series
我正在尝试使用斐波那契数列进行练习。
我必须用一个递归函数来实现,连续的斐波那契的 n 个素数并打印它们
在同一个函数中。问题是我的函数还打印了中间数字。
例如,n = 6
的结果应为:1 1 2 3 5 8
。
有什么解决办法吗?
谢谢
#include<iostream>
using namespace std;
int rec(int n)
{
int a, b;
if (n == 0 || n == 1)
{
return n;
}
else
{
a = rec(n - 1);
b = rec(n - 2);
cout << a + b << endl;
return a + b;
}
}
int main()
{
int n = 6;
rec(n);
return 0;
}
我得到了static int
的帮助。这就是你想要的方式。
void rec(int n)
{
static int a=0,b=1,sum;
if(n>0)
{
sum = a+b;
a=b;
b= sum;
cout<<sum<<" ";
rec(n-1);
}
}
尽管您必须自己在 main()
中打印第一个斐波那契数。
cout<<"0 ";
rec(n);
因为你在rec
中打印,因为递归它会打印多次。不需要在递归函数中打印。而是在 main
中打印结果
#include<iostream>
using namespace std;
int rec(int n)
{
int a, b;
if (n == 0 || n == 1)
{
return n;
}
else
{
a = rec(n - 1);
b = rec(n - 2);
//cout << a + b << endl;
return a + b;
}
}
int main()
{
int n = 6;
for (int i = 1; i <= n; i++)
{
cout << rec(i) << endl;
}
system("pause");
return 0;
}
你可以使用这个:
#include<iostream>
using namespace std;
#define MAXN 100
int visited[MAXN];
int rec(int n)
{
if(visited[n])
{
return visited[n];
}
int a, b;
if (n == 0|| n==1)
{
return n;
}
else
{
a = rec(n - 1);
b = rec(n - 2);
cout << " " <<a + b;
return visited[n] = a + b;
}
}
int main()
{
int n = 6;
cout<< "1";
rec(n);
cout<<endl;
return 0;
}
此实现使用动态规划。所以它减少了计算时间:)
我很确定你已经找到了可行的解决方案,但我有一个稍微不同的方法,不需要你使用数据结构:
/* 作者:Eric Gitangu
日期:2015 年 7 月 29 日
该程序吐出 32 位数字范围的斐波那契数列
假设:所有值都是 +ve ;因此 unsigned int 在这里工作
*/
#include <iostream>
#include <math.h>
#define N pow(2.0,31.0)
using namespace std;
void fibionacci(unsigned int &fib, unsigned int &prevfib){
unsigned 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 ";
}
}
试试这个递归函数。
int fib(int n)
return n<=2 ? n : fib(n-1) + fib(n-2);
这是我所知道的最优雅的解决方案。
我正在尝试使用斐波那契数列进行练习。
我必须用一个递归函数来实现,连续的斐波那契的 n 个素数并打印它们
在同一个函数中。问题是我的函数还打印了中间数字。
例如,n = 6
的结果应为:1 1 2 3 5 8
。
有什么解决办法吗?
谢谢
#include<iostream>
using namespace std;
int rec(int n)
{
int a, b;
if (n == 0 || n == 1)
{
return n;
}
else
{
a = rec(n - 1);
b = rec(n - 2);
cout << a + b << endl;
return a + b;
}
}
int main()
{
int n = 6;
rec(n);
return 0;
}
我得到了static int
的帮助。这就是你想要的方式。
void rec(int n)
{
static int a=0,b=1,sum;
if(n>0)
{
sum = a+b;
a=b;
b= sum;
cout<<sum<<" ";
rec(n-1);
}
}
尽管您必须自己在 main()
中打印第一个斐波那契数。
cout<<"0 ";
rec(n);
因为你在rec
中打印,因为递归它会打印多次。不需要在递归函数中打印。而是在 main
#include<iostream>
using namespace std;
int rec(int n)
{
int a, b;
if (n == 0 || n == 1)
{
return n;
}
else
{
a = rec(n - 1);
b = rec(n - 2);
//cout << a + b << endl;
return a + b;
}
}
int main()
{
int n = 6;
for (int i = 1; i <= n; i++)
{
cout << rec(i) << endl;
}
system("pause");
return 0;
}
你可以使用这个:
#include<iostream>
using namespace std;
#define MAXN 100
int visited[MAXN];
int rec(int n)
{
if(visited[n])
{
return visited[n];
}
int a, b;
if (n == 0|| n==1)
{
return n;
}
else
{
a = rec(n - 1);
b = rec(n - 2);
cout << " " <<a + b;
return visited[n] = a + b;
}
}
int main()
{
int n = 6;
cout<< "1";
rec(n);
cout<<endl;
return 0;
}
此实现使用动态规划。所以它减少了计算时间:)
我很确定你已经找到了可行的解决方案,但我有一个稍微不同的方法,不需要你使用数据结构:
/* 作者:Eric Gitangu 日期:2015 年 7 月 29 日 该程序吐出 32 位数字范围的斐波那契数列 假设:所有值都是 +ve ;因此 unsigned int 在这里工作 */
#include <iostream>
#include <math.h>
#define N pow(2.0,31.0)
using namespace std;
void fibionacci(unsigned int &fib, unsigned int &prevfib){
unsigned 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 ";
}
}
试试这个递归函数。
int fib(int n)
return n<=2 ? n : fib(n-1) + fib(n-2);
这是我所知道的最优雅的解决方案。