C语言这个递归方法求斐波那契,始终想不痛是谁想出这个方法的

做自己 不忘初心 2019-09-28 12:37:32
递归求斐波那契,打死想不到居然是21个1相加,发明的这个方法的脑子是长什么样的,真想找他聊聊。
...全文
148 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
只是因为我想不出这种方法吧,所以觉得很神奇。
铖邑 2019-10-07
  • 打赏
  • 举报
回复
这个不是想象中那么难,楼主可以看看用数据结构模拟递归调用的解决办法。技术上的追求是无止境的,不要以为在路边捡到的一朵小花就是全部的风景。 另外,提醒楼主及时结帖
YGLeeeon 2019-10-06
  • 打赏
  • 举报
回复
引用 8 楼 SuperDay 的回复:
引用 6 楼 YGLeeeon 的回复:
引用 4 楼 SuperDay 的回复:
就是以空间换时间
我看楼主第一次接触,我就显摆一下,同时楼主要是有心人会进一步去探究递归算法。有什么不好的,老哥你真酸
不是酸,空间换时间是有缺陷的,除非你能把缺陷给改善一下
没有--我其实想回的不是你那条,是你下面那个,点错了。
铖邑 2019-10-06
  • 打赏
  • 举报
回复
引用 6 楼 YGLeeeon 的回复:
引用 4 楼 SuperDay 的回复:
就是以空间换时间
我看楼主第一次接触,我就显摆一下,同时楼主要是有心人会进一步去探究递归算法。有什么不好的,老哥你真酸
不是酸,空间换时间是有缺陷的,除非你能把缺陷给改善一下
YGLeeeon 2019-10-06
  • 打赏
  • 举报
回复
引用 5 楼 636f6c696e 的回复:
这个是最基础的解法,没人说是下效率高啊
我是菜鸡,我错了
YGLeeeon 2019-10-06
  • 打赏
  • 举报
回复
引用 4 楼 SuperDay 的回复:
就是以空间换时间
我看楼主第一次接触,我就显摆一下,同时楼主要是有心人会进一步去探究递归算法。有什么不好的,老哥你真酸
636f6c696e 2019-10-05
  • 打赏
  • 举报
回复
这个是最基础的解法,没人说是下效率高啊
铖邑 2019-10-05
  • 打赏
  • 举报
回复
就是以空间换时间
赵4老师 2019-09-29
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
YGLeeeon 2019-09-29
  • 打赏
  • 举报
回复
这样递归,效率太低了。有没有发现第1个数和第2个数被调用了8次。第3和第2个数调用了5次,第4和第3调用了3次,第4和第5个数的计算调用了2次。也就是越靠前的数被重复计算的次数越多.一共进行的冗余调用有14次。位数越冗余运算次数就会指数型增长。 递归算法是有套路的,给你来一个最基本的优化方法:分支记忆化
vector<int> record;
int func_1(int n) {
	if (n == 1 || n == 2) {
		record[n] = 1;
		return record[n];
	}
	if (record[n])
		return record[n];
	else {
		record[n] = func_1(n-1) + func_1(n-2);
		return record[n];
	}

}
int func(int n) {
	if (n == 1 || n == 2) {
		return 1;
	}
	return func(n - 1) + func(n - 2);
}

int main() {
	int N=0;
	cout << "求第N位斐波那契数:" << endl;
	cin >> N;
	record.assign(N+1,0);

	DWORD start;
	start = GetTickCount();
	cout<<func(N)<<endl;
	cout << "直接递归的用时:" <<(GetTickCount() - start) << endl;

	start = GetTickCount();
	cout << func_1(N) << endl;
	cout << "优化重复运算的用时:"<<(GetTickCount() - start) << endl;

	system("pause");
	return 0;
}
对比一下运算用时: 当运算靠前的斐波那契额数时 当运算大斐波那契数时:
铖邑 2019-09-28
  • 打赏
  • 举报
回复
这个程序貌似没错的呀?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧