关于递归的一些看法(斐波那契数列问题)

今天碰见个斐波那契数列问题(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)

注:上述都是先进入一个递归函数进行递归,若无法再次递归表明需要返回上层,递归时不会执行递归函数下面的函数,返回到的是设定的递归函数定义,直到需要返回上一层时才执行递归声明下的函数后返回上一层;表明本层底柜调用结束。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值