今天碰见个斐波那契数列问题(Fibonacci ),使用了递归调用的思想,代码如下图所示:
递归和非递归分别实现求第n个斐波那契数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int FibonacciSequence(int n) {
if (n == 1 || n == 2) {
return 1;
}
return FibonacciSequence(n - 1) + FibonacciSequence(n - 2);
}
int main()
{
int n = 0;
scanf("%d",&n);
printf("%d\n", FibonacciSequence(n));
system("pause");
return 0;
}
递归的思想就是大事化小的思想;
本题中的斐波那契数列通过查找百度可知其数列为:1,1,2,3,5,8,13,21,34,55....
从上可以看出第N个数其为前两个数的和,但又两个意外,即第一个和第二个数为1,所以我们写代码的时候一定要注意这个特殊情况;
数列为1,1,2,3,5,8...n
数列可以视为1,1,2,3,5,8...n-1,n的问题,将数列分为两个部分进行分析
也可视为1,1,2,3,5,8.., n-3,n-2, n-1,n 的问题
则上述就是本题的解题思路,大事化小,一直化解到特殊情况处结束。
所以我才用了递归n-1,n-2两个参数代表所有情况的出现
上述代码的关键是递归函数的调用问题:
int FibonacciSequence(int n) {
if (n == 1 || n == 2) {
return 1;
}
return FibonacciSequence(n - 1) + FibonacciSequence(n - 2);
}
第一次进入递归函数先进行if语句的判断,在进行return 一行的函数判断;(注:设置n为4)
这一行中有两个递归函数,先判断第一个函数FibonacciSequence(n - 1);
进入FibonacciSequence(n - 1)函数体,根据递归函数调用规则,调用其定义(FibonacciSequence(n - 1) 在这里相当于声明)
int FibonacciSequence(int n) {
if (n == 1 || n == 2) {
return 1;
}
此时n被声明函数变为了(n-1=3),if判断不成立;继续该递归循环,(n-1 = 2)判定if循环成立,返回值1;再次递归(n-1 = 1)得到返回值1;故根据n = 3是n=1和n=2的上层语句可以得到n=3时,返回值为2;(底层的返回值相加得到上层的返回值)退出第一个递归语句,n返回其最上层,即n变回了4;然后进入第二个递归语句FibonacciSequence(n - 2);(第一个递归语句的退出条件为其已无递归下去的必要)
当进入第二条递归语句时,其(n-2 = 2)进入if语句判断成立返回值为1,表明此时n = 2 的返回值为1与上述一致(不必相加);
而之后该语句无法再次递归,表明n = 4时,其返回值总共为 2 + 1 为 3 ;(n-1 = 3 时返回值为2,n-2的返回值为1)
注:上述都是先进入一个递归函数进行递归,若无法再次递归表明需要返回上层,递归时不会执行递归函数下面的函数,返回到的是设定的递归函数定义,直到需要返回上一层时才执行递归声明下的函数后返回上一层;表明本层底柜调用结束。