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

迭代算法与递归算法的概念及区别(4)时间:2009-01-25 本站整理

  作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。

  【程序】

以下是引用片段:

  #include

  #defineN100

  doublelimitW;

  intcop[N];

  structele{doubleweight;

  doublevalue;

  }a[N];

  intk,n;

  struct{int;

  doubletw;

  doubletv;

  }twv[N];

  voidnext(inti,doubletw,doubletv)

  {twv.=1;

  twv.tw=tw;

  twv.tv=tv;

  }

  doublefind(structele*a,intn)

  {inti,k,f;

  doublemaxv,tw,tv,totv;

  maxv=0;

  for(totv=0.0,k=0;k

  totv+=a[k].value;

  next(0,0.0,totv);

  i=0;

  While(i>=0)

  {f=twv.;

  tw=twv.tw;

  tv=twv.tv;

  switch(f)

  {case1:twv.++;

  if(tw+a.weight

  if(i

  {next(i+1,tw+a.weight,tv);

  i++;

  }

  else

  {maxv=tv;

  for(k=0;k

  cop[k]=twv[k].!=0;

  }

  break;

  case0:i--;

  break;

  default:twv.=0;

  if(tv-a.value>maxv)

  if(i

  {next(i+1,tw,tv-a.value);

  i++;

  }

  else

  {maxv=tv-a.value;

  for(k=0;k

  cop[k]=twv[k].!=0;

  }

  break;

  }

  }

  returnmaxv;

  }

  voidmain()

  {doublemaxv;

  printf(“输入物品种数

”);

  scanf((“%d”,&n);

  printf(“输入限制重量

”);

  scanf(“%1f”,&limitW);

  printf(“输入各物品的重量和价值

”);

  for(k=0;k

  scanf(“%1f%1f”,&a[k].weight,&a[k].value);

  maxv=find(a,n);

  printf(“

选中的物品为

”);

  for(k=0;k

  if(option[k])printf(“%4d”,k+1);

  printf(“

总价值为%.2f

”,maxv);

  }

  递归的基本概念和特点

  程序调用自身的编程技巧称为递归( recursion)。

一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:

(1) 递归就是在过程或函数里调用自身;

2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

本文来自编程入门网:http://www.bianceng.cn/Programming/sjjg/200901/11200_4.htm

迭代算法与递归算法的概念及区别(4)时间:2009-01-25 本站整理

  作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。

  【程序】

以下是引用片段:

  #include

  #defineN100

  doublelimitW;

  intcop[N];

  structele{doubleweight;

  doublevalue;

  }a[N];

  intk,n;

  struct{int;

  doubletw;

  doubletv;

  }twv[N];

  voidnext(inti,doubletw,doubletv)

  {twv.=1;

  twv.tw=tw;

  twv.tv=tv;

  }

  doublefind(structele*a,intn)

  {inti,k,f;

  doublemaxv,tw,tv,totv;

  maxv=0;

  for(totv=0.0,k=0;k

  totv+=a[k].value;

  next(0,0.0,totv);

  i=0;

  While(i>=0)

  {f=twv.;

  tw=twv.tw;

  tv=twv.tv;

  switch(f)

  {case1:twv.++;

  if(tw+a.weight

  if(i

  {next(i+1,tw+a.weight,tv);

  i++;

  }

  else

  {maxv=tv;

  for(k=0;k

  cop[k]=twv[k].!=0;

  }

  break;

  case0:i--;

  break;

  default:twv.=0;

  if(tv-a.value>maxv)

  if(i

  {next(i+1,tw,tv-a.value);

  i++;

  }

  else

  {maxv=tv-a.value;

  for(k=0;k

  cop[k]=twv[k].!=0;

  }

  break;

  }

  }

  returnmaxv;

  }

  voidmain()

  {doublemaxv;

  printf(“输入物品种数

”);

  scanf((“%d”,&n);

  printf(“输入限制重量

”);

  scanf(“%1f”,&limitW);

  printf(“输入各物品的重量和价值

”);

  for(k=0;k

  scanf(“%1f%1f”,&a[k].weight,&a[k].value);

  maxv=find(a,n);

  printf(“

选中的物品为

”);

  for(k=0;k

  if(option[k])printf(“%4d”,k+1);

  printf(“

总价值为%.2f

”,maxv);

  }

  递归的基本概念和特点

  程序调用自身的编程技巧称为递归( recursion)。

一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:

(1) 递归就是在过程或函数里调用自身;

2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

本文来自编程入门网:http://www.bianceng.cn/Programming/sjjg/200901/11200_4.htm


相关文章

  • 程序设计方法学第七章
  • 第7章 递归程序设计 本章目标 ?什么是递归定义,递归的优缺点 ?什么是迭代,递归与迭代的区别 ?什么是递归数据结构, 有哪些结构是递归数据结构 ?什么是简化的函数型递归程序模型, 递归程序的计算规则 ?递归程序的正确性证明 内容线索递归的 ...查看


  • 西安邮电大学算法资料
  • 选择: 1.算法的性质包括输入.输出.( A ).有限性. A. 确定性 B. 随机性 C. 复杂性 D. 渐近复杂性 2.备忘录法是那种算法的变形( B ). A.分治算法 B.动态规划算法 C.贪心算法 D.回溯法 3.具有最优子结构的 ...查看


  • 求时间复杂度的方法
  • 求时间复杂度的方法 1.求和法 当算法中语句的执行次数与某一变量有直接关系,而该变量的变化起止范围又较为明确,则可以利用求和公式得出最大的语句频度f(n),再对其取数量级(阶)即可. 例1有算法如下: ①for(i=1;i 解:以上算法中频 ...查看


  • 递归方程解的渐近阶的求法
  • 递归方程解的渐近阶的求法 递归算法在最坏情况下的时间复杂性渐近阶的分析,都转化为求相应的一个递归方程的解的渐近阶.因此,求递归方程的解的渐近阶是对递归算法进行分析的关键步骤. 递归方程的形式多种多样,求其解的渐近阶的方法也多种多样.这里只介 ...查看


  • 运筹学毕业论文-单纯形法
  • 目 录 1 算法分析 1.1单纯形算法 ........................................... (1) 2 单纯形算法的实现 2.1输入模块 ................................. ...查看


  • HMM学习最佳范例
  • HMM学习最佳范例 转自:我爱自然语言处理 ( ) 一.介绍(Introduction) 我们通常都习惯寻找一个事物在一段时间里的变化模式(规律).这些模式发生在很多领域,比如计算机中的指令序列,句子中的词语顺序和口语单词中的音素序列等等, ...查看


  • 隐马尔科夫模型
  • 隐马尔科夫模型 隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价值.平时,经常能接触到涉 ...查看


  • 数据挖掘十大经典算法
  • 数据挖掘十大经典算法 一. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法, 其核心算法是ID3 算 法. C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增 ...查看


  • 自适应滤波器论文
  • 自适应滤波器论文 1 绪 论 人类传递信息的主要媒介是语言和图像.据统计,在人类接受的信息中,听觉信息占20%,视觉信息占60%,其中如味觉.触觉.嗅觉总的加起来不过占20%,所以图像信息是十分重要的信息.然而,在图像的获取和图像信号的传输 ...查看


热门内容