此题面试时会常常考到,费氏数列的实现规则如下:
假定n=10,那么输出十个费氏数列
首先要明白费氏数列的实现规则,第一:假定n=10的情况下,那么实现规则如下:
1 1 2 3 5 8 13 21 34 55 89
不知道有没有发现规律,规律就是每次的新值都会和前一个相加,而前面会打印两次1是因为费氏数列每次都从1开始计算,第一次是1但是1前面没有任何可加值所以1+0还是=1,但是到了第三次,1前面已经有了一个1,所以1+1=2,第四次就是2+1=3,第三次就是3+2=5,按照这个规律就形成了费氏数列,那么用编程来做一般面试题会让你写多个回圈(循环)实现方式,比如递归,典型循环,goto,这里博主全部给实现了一下:
1.for循环实现:
int main(){
//要求用户输入费氏数列大小
int n = 0;
printf("请输入费氏数列的大小:");
scanf("%d", &n);
if (n <= 0){
printf("费氏数列大小错误!");
return 0;
}
//开始计算费氏数列
int s = 0; //用于存储费氏数列的前值
int s1 = 1; //费氏数列新值,注意起始值是1,所以新值一定从1开始
int f = 1; //费氏数列结果值,赋值1是因为打印顺序原因
for (int i = 0; i <= n; ++i){
printf("%d ", f);
f = s + s1; //计算前值与新值相加结果,并保存新值
s = s1; //保存前值
s1 = f; //保存新值
}
getchar(); //吃掉空格
getchar();
return 0;
}
//while
int main(){
//要求用户输入费氏数列大小
int n = 0;
printf("请输入费氏数列的大小:");
scanf("%d", &n);
if (n <= 0){
printf("费氏数列大小错误!");
return 0;
}
//开始计算费氏数列
int s = 0; //用于存储费氏数列的前值
int s1 = 1; //费氏数列新值,注意起始值是1,所以新值一定从1开始
int f = 1; //费氏数列结果值,赋值1是因为打印顺序原因
int i = 0;
while(i<=n){
printf("%d ", f);
f = s + s1; //计算前值与新值相加结果,并保存新值
s = s1; //保存前值
s1 = f; //保存新值
++i; //while
}
getchar(); //吃掉空格
getchar();
return 0;
}
//go to
int main(){
//要求用户输入费氏数列大小
int n = 0;
printf("请输入费氏数列的大小:");
scanf("%d", &n);
if (n <= 0){
printf("费氏数列大小错误!");
return 0;
}
//开始计算费氏数列
int s = 0; //用于存储费氏数列的前值
int s1 = 1; //费氏数列新值,注意起始值是1,所以新值一定从1开始
int f = 1; //费氏数列结果值,赋值1是因为打印顺序原因
int i = 0;
num0:
if (i <= n){
goto num1;
}
else{
goto num2;
}
num1:
printf("%d ", f);
f = s + s1; //计算前值与新值相加结果,并保存新值
s = s1; //保存前值
s1 = f; //保存新值
++i; //goto
goto num0;
num2:
getchar(); //吃掉空格
getchar();
return 0;
}
3. 递归实现
int func(int n){
//递归静态变量
static int s = 0; //用于存储费氏数列的前值
static int s1 = 1; //费氏数列新值,注意起始值是1,所以新值一定从1开始
static int f = 1; //费氏数列结果值,赋值1是因为打印顺序原因
if (n <= 0){
return 0;
}
else{
f = s + s1; //计算前值与新值相加结果,并保存新值
s = s1; //保存前值
s1 = f; //保存新值
printf("%d ", f);
return func(n - 1);
}
}
int main()
{
//要求用户输入费氏数列大小
int n = 0;
printf("请输入费氏数列的大小:");
scanf("%d", &n);
if (n <= 0){
printf("费氏数列大小错误!");
return 0;
}
func(n);
getchar(); /[表情]掉空格
getchar();
return 0;
}