recursion 递归以及递归的缺点
递归定义的算法有两部分:
递归基:直接定义最简单情况下的函数值;
递归步:通过较为简单情况下的函数值定义一般情况下的函数值。
应用条件与准则:
(1)问题具有某种可借用的类同自身的子问题描述的性质;
(2)某一问题有限步的子问题(也称做本原问题)有直接的解存在。
在计算机中是利用栈来实现recursion的,对于每一次递归的调用,计算机都会将调用者的局部变量以及返回地址储存在栈中,待回调时恢复局部变量,并返回到调用地址中
正因计算机会保存所有的局部变量,这将导致额外的开销,使程序运行效率底下,我们可以拿计算斐波那契数列作例子

由此形式读者很容易想到用递归解决问题,但这往往是一个陷进
当n!=0||n!=0时,我们将要执行
,在F(n-1)中又要执行F(n-2)+F(n-3),在F(n-2)中执行F(n-3)+F(n-4),要掉用以及保存的变量数量呈级数式的增长,同时其中又存在许多重复的,这么做个程序带来了额外的开销,显得recursion效率低下
下面我们来具体比较一下
#include<iostream>
#include<ctime>
using namespace std; //递归
int recursion(int n)
{
if(n==1||n==2)
return 1;
else
return recursion(n-1)+resursion(n-2);
} //迭代
int iteration(int n)
{
int p1=1;
int p2=1;
while(n->2)
{
int temp=p2;
p2=p1+p2;
p1=temp;
}
return p2;
} int main()
{
int n;
cin>>n; clock_t start=clock();
recursion(n);
clock_t end=clock();
cout<<"Recursion 用时: "<< start-end << endl; start=clock();
iteration(n);
end=clock();
cout<<"iteration 用时: "<< start-end << endl; return 0;
}
recursion 递归以及递归的缺点的更多相关文章
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- Java基础知识强化之IO流笔记12:递归之递归解决问题的思想(图解)
1. 使用递归计算5!的结果,递归思想的本质如下: 2. 下面就要使用代码实现这个递归: 递归实现分析: (1)做递归要写一个方法 (2)出口条件 (3)规律 代码实现如下: package com. ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】
C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现[可运行] #include <stdio.h> #include <stdlib.h> typedef int Key ...
- 【Python算法】递归与递归式
该树结构显示了从1(根节点)到n(n个叶节点)的整个倍增过程.节点下的标签表示从n减半到1的过程. 当我们处理递归的时候,这些级数代表了问题实例的数量以及对一系列递归调用来说处理的相关工作量. 当我们 ...
- [速记]关于指针,引用和递归和解递归——C++
在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- Unity3D学习笔记——递归+非递归遍历GameObject的子物体
在Unity3D中没有提供直接的方法获取某个GameObject的子GameObject,但是所有的GameObject都有transform对象,所以,一般是通过获取子GameObject的tran ...
- Java基础知识强化之IO流笔记11:递归之递归概述和注意事项
1. 递归: 方法定义中调用方法本身的现象. e.g: public void show(int n ) { if(n <= 0) { System.exit(0); } System.out. ...
随机推荐
- Adding DOM elements to document
1.JavaScript 添加DOM Element 执行效率比较: 抄自:http://wildbit.com/blog/2006/11/21/javascript-optimization-add ...
- sublime从官网纯净版到插件完整版
01.纯净版下载地址:www.sublimetext.com/ 02.下载Package Control插件管理工具,网址:https://packagecontrol.io/ 安装介绍:https: ...
- UEditor+七牛,实现图片直连上传
最近做的项目,涉及到使用富文本编辑器,我选择了百度的UEditor.同时,我们的图片放在七牛云存储上.关于这两者间的集成,我写下一些个人的经验,与大家分享. 图片上传方案 目前来说,Web端基于七牛等 ...
- WITH common_table_expression
Feature: 公用表表达式只能包含一个SELECT,多SELECT需UNION,UNION ALL 公用表表达式只能引用一次 公用表表达式可以包括对自身的引用,这种表达式称为递归公用表表达式 -- ...
- IOS开发小技巧,知识点
1.IOS模拟器第一次打开需要进入“设置”中关掉"Auto-Capitalization"选项. 2.NSInteger转化 NSString类型: [NSString strin ...
- Html批量读取json
html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <sc ...
- Node.js:全局对象
概要:本篇博客主要介绍了node.js中的全局对象. 在JavaScript中,通常window是全局对象,而node.js中的全局对象是global,所有全局变量(除了global本身之外)都是gl ...
- swift 2中关键字和解释整理
1.swift 最新关键字和符号参考:https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Prog ...
- POJ 3710 Christmas Game#经典图SG博弈
http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...
- linux上安装mono发布.net网站步骤
在linux上部署mono 1.自己安装好linux 2.使用桥接方式,让虚拟机和本机在一个局域网内 3.安装apache服务器 4.安装libgdiplug 5.安装mono 6.安装xsp 7.安 ...