【问题描述】
编写程序,利用 fun 函数递归求斐波那契数列。
输入:
6
输出:
8
【知识剖析】
递归是指:在某个函数的内部调用该函数本身,例如:
int fun(int n){
fun(n-1);//在fun函数内部调用fun这个函数
//类似套娃
}
斐波那契数列是指:数列第一项和第二项值为1,从第三项起,其值为前两项之和。例如:
1,1,2,3,5,8,13,21,34...
本题中输入的6
代表的是数列中的第6项,对应的值为8,所以输出8。
【思路分析】
主函数:
(1)输入一个整数n
(2)将n传递给fun函数,用m接收fun的返回值
(3)将返回值m输出
#include<stdio.h>
int main(){
int n, m;//m表示n的
scanf("%d", &n);//输入n
m = fun(n);//调用fun函数,值传递n,m接收fun函数返回值
printf("%d", m);//输出m
}
递归思路
1.我们需要将第n项值的计算过程抽象出来:第n项的值 = 第n-1项的值 + 第n-2项的值
2.而第n-1项的值又可以抽象为:第n-1项的值 = 第n-2项的值 + 第n-3项的值
3.同理,第n-2项的值可以抽象为:第n-2项的值 = 第n-3项的值 + 第n-4项的值
套娃形式存在
如何变为递归解决呢?
我们将第n项的值
用fun(n)
表示,可以得到:第n-1项的值
用fun(n-1)
表示;第n-2项的值
用fun(n-2)
表示。
fun(n) = fun(n-1) + fun(n-2)
而当n=1或者n=2时,f(n)的值为1,这里用if判断即可。
fun函数:
(1)形参接收值传递的n
(2)利用递归求n对应的斐波那契数列
(3)将数列中第n项的值返回
//n为int
//fun计算结果为int,所以函数类型为int
int fun(int n){
if(n==1 || n==2){//如果n为第一项或者第二项
return 1;//他俩的值为1,直接返回即可
}
//如果n>2,则需要利用递归计算
//而函数那么第n项的值需要由第n-1项和第n-2项的值相加得到
//fun(n-1)表示第n-1项的值,也就是n的前一项
//fun(n-2)表示第n-2项的值,也就是n的再前一项
return fun(n-1) + fun(n-2);//求出总和后返回即可
}
【代码注释】
#include<stdio.h>
//n为int
//fun计算结果为int,所以函数类型为int
int fun(int n){
if(n==1 || n==2){//如果n为第一项或者第二项
return 1;//他俩的值为1,直接返回即可
}
//如果n>2,则需要利用递归计算
//而函数那么第n项的值需要由第n-1项和第n-2项的值相加得到
//fun(n-1)表示第n-1项的值,也就是n的前一项
//fun(n-2)表示第n-2项的值,也就是n的再前一项
return fun(n-1) + fun(n-2);//求出总和后返回即可
}
int main(){
int n, m;//m表示n的
scanf("%d", &n);//输入n
m = fun(n);//调用fun函数,值传递n,m接收fun函数返回值
printf("%d", m);//输出m
}
【运行结果】
【总结】
通过分析fun函数需要计算的结果,来识别我们需要有哪些实参,哪些形参。
再分析计算结果是什么类型,以此来确定return语句和函数类型。
先把主函数中的逻辑理清楚,再分析题中的子函数的计算部分。
写完代码后,把自己的代码当做一道程序阅读题计算一遍。