问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言编程问题,循环+递归

发布网友 发布时间:2022-05-13 09:48

我来回答

4个回答

热心网友 时间:2023-10-05 09:15

int count = 0;

void a( void )

{

�0�2 count++;

�0�2 if ( count < 100 )

�0�2 a(); // 如果count<100, 调用自己。一直到100就停止!不过递归多了耗尽堆栈会崩溃!

}

递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
  递归算法的特点
  递归过程一般通过函数或子过程来实现。
  递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。
  递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
  递归算法解决问题的特点:
  (1) 递归就是在过程或函数里调用自身。
  (2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
  递归算法所体现的“重复”一般有三个要求:
  一是每次调用在规模上都有所缩小(通常是减半);
  二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
  三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
  例子如下:
  描述:把一个整数按n(2<=n<=20)进制表示出来,并保存在给定字符串中。比如121用二进制表示得到结果为:“1111001”。
  参数说明:s: 保存转换后得到的结果。
  n: 待转换的整数。
  b: n进制(2<=n<=20)
  void
  numbconv(char *s, int n, int b)
  {
  int len;
  if(n == 0) {
  strcpy(s, "");
  return;
  }
  /* figure out first n-1 digits */
  numbconv(s, n/b, b);
  /* add last digit */
  len = strlen(s);
  s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];
  s[len+1] = '\0';
  }
  void
  main(void)
  {
  char s[20];
  int i, base;
  FILE *fin, *fout;
  fin = fopen("palsquare.in", "r");
  fout = fopen("palsquare.out", "w");
  assert(fin != NULL && fout != NULL);
  fscanf(fin, "%d", &base);
  /*PLS set START and END*/
  for(i=START; i <= END; i++) {
  numbconv(s, i*i, base);
  fprintf(fout, "%s\n", s);
  }
  exit(0);
  }
  递归算法简析(PASCAL语言)
  递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写
  程序能是程序变得简洁和清晰.
  一 递归的概念
  1.概念
  一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
  如:
  procere a;
  begin
  .
  .
  .
  a;
  .
  .
  .
  end;
  这种方式是直接调用.
  又如:
  procere b; procere c;
  begin begin�0�2
  . .
  . .
  . .
  c; b;
  . .
  . .
  . .
  end; end;
  这种方式是间接调用.
  例1计算n!可用递归公式如下:
  1 当 n=0 时�0�2
  fac(n)={n*fac(n-1) 当n>0时
  可编写程序如下:
  program fac2;
  var
  n:integer;
  function fac(n:integer):real;
  begin
  if n=0 then fac:=1 else fac:=n*fac(n-1)
  end;
  begin
  write('n=');readln(n);
  writeln('fac(',n,')=',fac(n):6:0);
  end.
  例2 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.
  设n阶台阶的走法数为f(n)
  显然有
  1 n=1�0�2
  f(n)={
  f(n-1)+f(n-2) n>2
  可编程序如下:
  program louti;
  var n:integer;
  function f(x:integer):integer;
  begin
  if x=1 then f:=1 else
  if x=2 then f:=2 else f:=f(x-1)+f(x-2);
  end;
  begin
  write('n=');read(n);
  writeln('f(',n,')=',f(n))
  end.
  二,如何设计递归算法
  1.确定递归公式
  2.确定边界(终了)条件
  三,典型例题
  例3 梵塔问题
  如图:已知有三根针分别用1,2,3表示,在一号针中从小放n个盘子,现要求把所有的盘子
  从1针全部移到3针,移动规则是:使用2针作为过度针,每次只移动一块盘子,且每根针上
  不能出现大盘压小盘.找出移动次数最小的方案.
  程序如下:
  program fanta;
  var
  n:integer;
  procere move(n,a,b,c:integer);
  begin
  if n=1 then writeln(a,'--->',c)
  else begin
  move(n-1,a,c,b);
  writeln(a,'--->',c);
  move(n-1,b,a,c);
  end;
  end;
  begin
  write('Enter n=');
  read(n);
  move(n,1,2,3);
  end.
  例4 快速排序
  快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1, 处理结束.
  程序如下:
  program kspv;
  const n=7;
  type
  arr=array[1..n] of integer;
  var
  a:arr;
  i:integer;
  procere quicksort(var b:arr; s,t:integer);
  var i,j,x,t1:integer;
  begin
  i:=s;j:=t;x:=b;
  repeat
  while (b[j]>=x) and (j>i) do j:=j-1;
  if j>i then begin t1:=b; b:=b[j];b[j]:=t1;end;
  while (b<=x) and (i<j) do i:=i+1;
  if i<j then begin t1:=b[j];b[j]:=b;b:=t1; end
  until i=j;
  b:=x;
  i:=i+1;j:=j-1;
  if s<j then quicksort(b,s,j);
  if i<t then quicksort(b,i,t);
  end;
  begin
  write('input data:');
  for i:=1 to n do read(a);
  writeln;
  quicksort(a,1,n);
  write('output data:');
  for i:=1 to n do write(a:6);
  writeln;
  end.

热心网友 时间:2023-10-05 09:16

你好循环可以转成递归,有些递归可以转成循环.但是递归更加容易实现和理解,而循环效率更好一点.但是差别不是很大.

貌似有个名人说过"迭代是人,递归是神"

迭代其实就是一个循环的过程.. 你可以看一下http://hi.baidu.com/tanchunhai/blog/item/2c33092465837b32c89559c1.html

这个介绍递归与迭代(循环)的区别,很详细
楼主可以去看看,祝你进步! 希望对你有帮助啊

热心网友 时间:2023-10-05 09:16

画出递归图,一层一层递归下去,然后一层一层返回.

热心网友 时间:2023-10-05 09:17

循环就是循环递归就是遍历foreach
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
立秋后钓鱼什么风向好-立秋钓鱼风向怎么选 赱乂砉込儬 怎么读 "赱"读什么? 解决电脑无法搜索到iPhone热点的问题如何修复iPhone热点无法在电脑上显... 电脑搜不到iphone12热点 iphone开热点给电脑搜不到 国企的地产有哪些 国企下设公司是什么意思? 红加蓝加绿是什么色. 梦幻西游75级开三倍抓鬼一轮有多少经验 c语言程序设计问题(递归) 编程序,用递归函数 C语言怎样用递归方法编写程序 求s=1!+2!+3!+...10! c语言 编写程序 使用递归 用C++语言编写程序,递归函数 编写程序,用递归的方法求1+2+3+…+n,可设递归函数为fun5()。(1)递归结束条件为n=0_百度问一问 中级会计财务管理一个书上例题 中级会计的一道例题,没看明白,求指点。 我要买会计中级习题 中华和东奥 哪个好、 (长期股权投资转换 中级会计实务例题) 中级会计师,中级会计实务例题5我怎么看不懂。?求解题思路,给30分高分!! 中级财务会计习题1 汽车除了点烟口有别的地方可以接usb充电吗? 如何找回以前的? 中级会计 财务管理例题 (跪求) 如何找回以前的? 汽车上的USB,这样我怎么在车上充电 以前用的怎么才能找回来? 怎样找回原来注册的 一个手机号码注册了两个之前那个微信怎么找回来? c语言:用递归方法编写程序,求n阶勒让德多项式的值 编程一个C语言程序,使用递归方法,输入两个数,采用辗转相除法来计算最大公约数 编写递归函数将一个整数逆序输出,求C程序 中信证券至信版和中信建投有什么区别? 中信证券至信版的介绍 编写程序,用递归法将一个十进制整数转换成二进制数。 中信证券至信版的软件简介 如何为中信证券至信版增加一个自选股2 中信证券至信版 如何修改密码 分红型保险退保 中信证券至信手机版如何才能下载 在单片机中,什么是补码?最好能给出定义和例子,谢谢 补码的准确定义 怎么取消电脑的密码 行李箱密码忘记了,怎么办 解放军军衔一杠三星是代表什么? 有一杠的是什么 英语句子里面一杠代表什么 福建省2012年二级建造师什么时候考试 台式机连接无线网速慢怎么办