已知数列前10个数字为1、1、1、2、3、4、6、9、13、19,现从键盘输入一个整数n,试找出规律输出前n项。
输入
输入一个整数n(4\le n\le100)n(4≤n≤100)。
输出
输出该数列的前n项(数与数之间有一空格,行末无空格,有换行)。
样例
输入
复制
6
输出
复制
1 1 1 2 3 4
参考代码:
递归算法:
#include <iostream>
using namespace std;
int fx(int n)
{
if(n==0 || n==1)return n;
if(n==2)return 1;
return fx(n-1)+fx(n-3);
}
void print_recursive_algorithm(int n)
{
if(n==0)return;
print_recursive_algorithm(n-1);
cout<<fx(n)<<' ';
return;
}
void print_Normal_output(int n)
{
for(int i=1;i<=n;i++)cout<<fx(i)<<' ';
return;
}
int main(void)
{
int n;
cin>>n;
//print_recursive algorithm(n);
print_Normal_output(n);
return 0;
}
但是,可能会运行超时;
所以正常的方法:
#include <iostream>
using namespace std;
int main(void)
{
int n;
cin>>n;
unsigned long long a[n+1]={0,1,1};
cout<<1<<' '<<1<<' ';
for(int i=3;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
cout<<a[i]<<' ';
}
return 0;
}
也可以浅浅地用下动态规划储存一下结果,再套用下递归的框架:
#include <iostream>
using namespace std;
unsigned long long a[500]={0,1,1};
void fx(int n)
{
if(n!=3)fx(n-1);
a[n]=a[n-1]+a[n-3];
cout<<a[n]<<' ';
return;
}
int main(void)
{
int n;
cin>>n;
cout<<1<<' '<<1<<' ';
fx(n);
return 0;
}
OJ:找规律2
作者为初中生,有问题见谅,请多关照。