递归算法和迭代算法的优劣对比

原创 2018年04月15日 16:25:54

Problem 2001 二叉树中的小球下落

Accepted: 34    Total Submit: 55
Time Limit: 1000ms    Memony Limit: 32768KB

Description

 有一棵满 二叉树,所有结点从上到下,从左到右的编号为1,2,…,2^D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次小球落到一个开关上时,它的状态都会改变。当小球到达一个内结点时,如果 该结点上的开关关闭,则往左走,否则往右走,直到走到叶结点。一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?

Input

 输入有若干行,第行2个数据D和n,D是二叉树的深度,n是小球的个数。输入最多1000组。

Ouput

 输出最后个小球落下的叶结点的编号。

Sample Input

4 2
3 4
10 1
2 2
8 128
16 12345
20 524288

Sample Output

12
7
512
3
255
36358
1048575

递归:

#include <iostream>
#include <cmath>
using namespace std;
int Max;
int D,n;
int flag[9999999];
void start(){
	Max =pow(2.0,D*1.0)-1; 
	for(int i=1;i<=Max;i++){
			flag[i] = false;
	}
};
int find(int flag[],int j){	
	if(flag[j]==false){
		flag[j] = true;
		j = 2*j;
		if(j>=(pow(2.0,D*1.0-1))){
			flag[j] = true;
			return j;
		}else{
			find(flag,j);
		}
	}else{
		flag[j] = false;
		j = 2*j+1;
		if(j>=(pow(2.0,D*1.0-1))){
			flag[j] = true;
			return j;
		}else{
			find(flag,j);
		}
	}
};
int main()
{
	int index = 0;
	while(cin>>D>>n){
		start();	
		for(int i=0;i<n;i++){
			index = find(flag,1);
		}
		cout<<index<<endl;
	}
	return 0;
}

迭代:

#include<iostream>
#include<cmath>
using namespace std;
bool tree[1000000];
int main()
{
	int i,j,n,D;
	while(cin>>D>>n)
	{
		memset(tree,false,sizeof(tree));
		for(i=0;i<n;i++)
		{
			j=1;
			int d=D-1;
			while(d--)
			{
				if(tree[j]==false)
				{
					tree[j]=true;
					j=2*j;
				}
				else
				{
					tree[j]=false;
					j=2*j+1;
				}
			}
		}
		cout<<j<<endl;
	}
	return 0;
}

两种运行结果:


题目源:

http://218.5.241.13:8060/oj/base/base_showProblem.jsp?pid=2001


迭代是人,递归是神(迭代与递归的总结:比较)

在计算机编程实现中有常常两种方法:一曰迭代(iterate);二曰递归(recursion)。 从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行...
  • LG1259156776
  • LG1259156776
  • 2015-07-12 13:55:30
  • 10183

【数据结构与算法】深入浅出递归和迭代的通用转换思想

递归和递归的深入浅出 一般来说,能用迭代的地方就不要用递归!理论上讲,所有的递归和迭代之间都能相互转换! (一)何为迭代?首先我们来看下面这段简单的代码:int sum(int n ) { ...
  • terence1212
  • terence1212
  • 2016-06-05 11:36:10
  • 3051

对分查找算法(迭代和递归方式)

对分查找算法(迭代和递归方式) 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。 迭代方式 public s...
  • hjy132
  • hjy132
  • 2017-03-16 10:46:22
  • 571

快速分类递归算法改写成迭代算法

快速分类递归算法改写成迭代算法/*将data[low, high]进行快速分类的迭代算法(WIN-TC1.9.1k中文DOS环境调试通过)*/#include "stdio.h"#include "c...
  • yzhhome520
  • yzhhome520
  • 2006-04-01 22:29:00
  • 1017

迭代算法与递归算法的概念及区别

迭代算法是用计算机处理问题的一种基本方法。它利用计算机运算速度快、适合做重复性操做的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新...
  • politefish
  • politefish
  • 2009-08-31 20:12:00
  • 28349

递归和迭代的区别

递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的...
  • swliao
  • swliao
  • 2010-03-02 10:29:00
  • 90652

【算法】迭代和递归

在日常程序的编写中,复杂的项目日益增多,在后期的代码优化上需要花更多的时间和精力。在前期的规划上也越来越重要,前期良好的规划可以避免后期遇到些奇怪的问题。 这次博客我希望通过讲解下迭代和递归的具...
  • dark00800
  • dark00800
  • 2017-03-13 15:09:22
  • 156

递归3: 汉诺塔的递归与迭代实现

递归实现与main(): /*------------------------------------------------------ 汉诺塔主要是有三个塔座X,Y,Z,要求将从小到大编号为 1...
  • yss28
  • yss28
  • 2013-10-18 11:23:38
  • 2295

递归算法和迭代算法的优劣对比

Problem 2001 二叉树中的小球下落Accepted: 34    Total Submit: 55Time Limit: 1000ms    Memony Limit: 32768KBDes...
  • yky__xukai
  • yky__xukai
  • 2018-04-15 16:25:54
  • 36

牛顿迭代算法与递归算法的概念和区别

  • 2011年03月01日 19:48
  • 23KB
  • 下载
收藏助手
不良信息举报
您举报文章:递归算法和迭代算法的优劣对比
举报原因:
原因补充:

(最多只允许输入30个字)