递归法产品实现策划程序程序

递归法实现程序_百度知道
递归法实现程序
如用递归法将一个整数N转换成字符串:输入123,应输出字符串“123”
提问者采纳
10) ;}void main(){
int num #include &输入整数;) ;9)
f(num/string, num%10+48) ;; printf(&void f(int num){ if(num& printf(&%c&%d& f(num) .h&gt:& scanf(&quot, &num) .h&#include &
请问递归结束条件及为什么输出的是 num%10+48
递归结束条件很简单,因为要输出的是数字对应的ASCII码,所以如果是个位数就直接转为ASCCII码输出,如果大于9说明不是个位数,所以要递归调用f(),但是此时f()的参数应该是num/10(即去掉原来数字的最后一位)。关于为什么输出num%10+48:假如我们输入123,想通过递归输出&123&字符串:那么我们需要调用f(123),分析一下递归的过程:首先进入f(123),判断if(123&9),条件成立,执行递归f(num/10)即f(12),然后进入f(12),判断if(12&9),条件成立,执行递归f((num/10)即f(1),然后进入f(1),判断if(1&9)不成立(即达到递归结束的条件),所以开始执行printf(),此时输出的就是1%10+48正好是1的ASCII码'1',然后f(1)返回到上一层f(12)中,此时接着f(12)继续执行,下一条语句是printf(),输出的就是12%10+48,正好是2的ASCII码'2',然后f(12)返回到上一层f(123)中,此时接着f(123)继续执行,下一条语句是printf(),输出的就是123%10+48,正好是'3'的ASCII码,然后f(123)返回,整个函数执行完毕,顺利输出”123“.
提问者评价
谢谢你的耐心解答,好详细呀
其他类似问题
为您推荐:
其他3条回答
; }}int main(void){ printf(& convert(n&#47,buf).h&0){ buf[k++]=(' convert(n)#include&10); return 0;#include&;void convert(int n){ if(n&0&#39,&n);n&int k=0; scanf(&%d&%s&#92.h&char buf[20]={0};+n%10)
如果这样的话,若输入123,输出的是不是“321”
对呀,输入123,输出321没有外边的引号,但它已经转换为字符了,如果你要引号的的话,很容易加上的!如下引号已加上!#include&stdio.h&#include&stdlib.h&char buf[20]={'&'};int k=1;void convert(int n){ if(n&0){ buf[k++]=('0'+n%10); convert(n/10); } else {
buf[k++]='&'; }}int main(void){ scanf(&%d&,&n); convert(n); printf(&%s\n&,buf); return 0;}
aaa(int n){if(n&0){int i=n%10;aaa(n/10);printf(&%d&,n);}}
#include &stdio.h&#include &stdlib.h&#include &math.h&char *itos(unsigned long int a){static char *st=NULL;if (st==NULL){if ((st=malloc(sizeof(char)*(int)floor(log10(a))+2))==NULL) return NULL;*(st+=(int)floor(log10(a)+1))='\0';*(--st,st+1)=a%10+'0';return itos(a/10);
else if (a)
{ *st--=(a%10)+'0'; return itos(a/10);
return st+1;}int main(void){char *uscanf(&%ul&,&uli);printf(&%s&,cf=itos(uli));free(cf);return 0;}
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁KSQX VC++递归法实现简单分形图形示例程序,比如扣氏曲线类定义等。大家在C/C++学习时都会 Mathimatics-Numerical algorithms 数值算法/人工智能 238万源代码下载-
&文件名称: KSQX
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 27 KB
&&上传时间:
&&下载次数: 3
&&提 供 者:
&详细说明:VC++递归法实现简单分形图形示例程序,比如扣氏曲线类定义等。大家在C/C++学习时都会遇到递归,课本上以汗诺塔为例进行讲解,然后大家都希望自己找到一个递归的实例。本代码以一个最简单的分形图形来示范递归的实现过程。
-VC++ recursion simple example of fractal graphics program, such as Button&#39 s definition of curve classes. Everyone in the C/C++ will encounter when learning recursion, Notari textbook example to explain to sweat, and then we all want to find a recursive example. The code is a simple recursive fractal graphics to demonstrate the implementation process.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&res\KSQX.ico&&...\KSQX.rc2&&...\KSQXDoc.ico&&...\Toolbar.bmp&&KSQX.APS&&KSQX.clw&&KSQX.cpp&&KSQX.dsp&&KSQX.dsw&&KSQX.h&&KSQX.rc&&KSQXClass.cpp&&KSQXClass.h&&KSQXDoc.cpp&&KSQXDoc.h&&KSQXView.cpp&&KSQXView.h&&MainFrm.cpp&&MainFrm.h&&ReadMe.txt&&resource.h&&StdAfx.cpp&&StdAfx.h&&res
&近期下载过的用户:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 维则克方块:黑白递归调用。这是小弟学分形学是做的VC++ WIN32+GDI 编程;
&[] - 分形用一种新的视角来看待自然界中的那些不规则的事物,在分形的基础上林德梅叶设计了L系统用来模拟自然界的生物形态。L系统采用字符串重写机制,通过产生式的不断迭代形成字符串来指导龟形画出图形。三类不同的L系统从不同的方面增加了字符串的表现能力,使L系统模拟的植物更加接近自然生长的状态。当然要使模拟的植物
&[] - ARM7 44B0X的原理图和PCB图 arm7的典型开发系列 希望对大家有帮助
&[] - 一个基于VC的有向无环图操作实例源代码,图的节点可以使任意可插入OLE项,在编辑一栏,您可以插入节点、删除节点、拓扑排序、广度遍历、最短路径、插入边等操作,该程序作者是中国地质大学的姜景捷。
&[] - 分形树的递归算法。利用递归算法生成分叉树,实际上是生成元在每一个层次上不断重画的过程
&[] - 分形动画,摇曳的递归分形树
VC6.0 需要的可以下载3601人阅读
C/C++开发之路(2)
一、什么叫做递归?
一个过程或在其定义或说明中有直接或间接调用自身的一种方法;
递归函数就是直接或间接调用自身的函数,也就是自身调用自己;
二、一般什么时候使用递归?
& & & &递归时常用的编程技术,其基本思想就是“自己调用自己”,一个使用递归技术的方法即是直接或间接的调用自身的方法。递归方法实际上体现了“以此类推”、“用同样的步骤重复”这样的思想,它可以用简单的程序来解决某些复杂的计算问题,但是运算量较大。
& & & & 还有些数据结构如二叉树,结构本身固有递归特性;此外,有一类问题,其本身没有明显的递归结构,但用递归程序求解比其他方法更容易编写程序,如八皇后问题、汉诺塔问题等。
& & & & 正因为递归程序的普遍性,我们应该学会使用递归来求解问题。直接递归程序与间接递归中都要实现当前层调用下一层时的参数传递,并取得下一层所返回的结果,并向上一层调用返回当前层的结果。至于各层调用中现场的保存与恢复,均由程序自动实现,不需要人工干预。因此,在递归程序的设计中关键是找出调用所需要的参数、返回的结果及递归调用结束的条件。
& & & & 如在阶乘函数Fact(n)中,各层要求传递一个自然数n,返回n*
Fact(n-1),递归调用结束的条件是n=0;据此,可以方便地写出它的对应程序
三、利用递归实现1到100以内的求和
#include&iostream&
int sum(int max);
int main()
cout&&sum(100)&&
int sum(int max){
if(max&1){
return max+sum(max-1);
}运行结果:5050
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23366次
排名:千里之外
(2)(5)(1)(1)只需一步,快速开始
扫一扫,访问微社区
查看: 764|回复: 12
java题--所有的递归实现都可以用循环的方式实现,请描述...
该用户从未签到黑马币技术分主题
高级黑马, 积分 1097, 距离下一级还需 903 积分
高级黑马, 积分 1097, 距离下一级还需 903 积分
本帖最后由 suihs11 于
22:56 编辑
求解答...所有的递归实现都可以用循环的方式实现?请描述一下这两种实现方式各自的优劣。并举例说明在什么情况下可以使用递归,而在什么情况下只能使用循环而不能使用递归?
递归算法:
优点:代码简洁、清晰,并且容易验证正确性
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的 ...
该用户从未签到黑马币技术分主题
中级黑马, 积分 446, 距离下一级还需 554 积分
中级黑马, 积分 446, 距离下一级还需 554 积分
递归算法:
优点:代码简洁、清晰,并且容易验证正确性
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理。
2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
3.递归和循环两者完全可以互换。如果用到递归的地方可以很方便使用循环替换,而不影响程序的阅读,那么替换成递归往往是好的。(例如:求阶乘的递归实现与循环实现。)
总结的很好,非常感谢&
该用户从未签到黑马币技术分主题
中级黑马, 积分 359, 距离下一级还需 641 积分
中级黑马, 积分 359, 距离下一级还需 641 积分
没有绝对的答案,使用递归还是循环根据情况而定。
递归的实现最大的优势是简单,但是函数递归调用可能会很深,每多一层递归都会多一些栈空间,当然会占用更多内存。
循环的实现相对递归最大的优势是节省内存,但是实现可能会复杂好几倍。
该用户从未签到黑马币技术分主题
中级黑马, 积分 624, 距离下一级还需 376 积分
中级黑马, 积分 624, 距离下一级还需 376 积分
就以计算阶乘为例来说循环和递归吧。
功能:实现n的阶乘。
-------------------------------------------------------------------------
class Circulate
& & & & private static int circulate (int n)
& & & & & & & & int circulate =
& & & & & & & & while (n&0)
& & & & & & & & {
& & & & & & & & & & & & System.out.println(n);
& & & & & & & & & & & & circulate *=n;
& & & & & & & & & & & & n--;
& & & & & & & & }
& & & & & & & &
& & & & public static void main (String [] args)
& & & & & & & & // 计算10的阶乘
& & & & & & & & System.out.println(circulate(10));
---------------------------------------------------------------------------
递归简单来说就是指函数在运行过程中不断的调用自己的一种现象。如下:
class Recursion
& & & & private static int recursion = 1;
& & & & private static int recursion ( int n)
& & & & & & & & if (n&0)
& & & & & & & & {
& & & & & & & & & & & & System.out.println(n);
& & & & & & & & & & & & recursion *=n;
& & & & & & & & & & & & n--;
& & & & & & & & & & & & // 调用自身
& & & & & & & & & & & & recursion(n);
& & & & & & & & }
& & & & & & & &
& & & & public static void main (String [] args)
& & & & & & & & // 计算10的阶乘
& & & & & & & & System.out.println(recursion(10));
结论:递归结构可读性差,使用较少。循环效率高,可靠性好。故一般情况下用循环代替递归。
该用户从未签到黑马币技术分主题
中级黑马, 积分 340, 距离下一级还需 660 积分
中级黑马, 积分 340, 距离下一级还需 660 积分
该用户从未签到黑马币技术分主题
中级黑马, 积分 503, 距离下一级还需 497 积分
中级黑马, 积分 503, 距离下一级还需 497 积分
如果方法比较多的话,建议用循环,比如想重复这个方法,用
boolean&&flag=
& && &重复的的类容
if(判断一下是否要循环){
& && &&&flag=
}while(flag);
用这种方式比递归要好的很多。。。。。。。。
该用户从未签到黑马币技术分主题
中级黑马, 积分 464, 距离下一级还需 536 积分
中级黑马, 积分 464, 距离下一级还需 536 积分
递归占的内存多,一层一层的叠加,循环就相对少一点,但是用循环就麻烦了,就像二叉树的遍历,递归用的代码行数少,但是运行麻烦,循环用的代码复杂但是运行简单
该用户从未签到黑马币技术分主题
中级黑马, 积分 611, 距离下一级还需 389 积分
中级黑马, 积分 611, 距离下一级还需 389 积分
递归耗资源,如果用循环麻烦,用递归简单,就用呗
该用户从未签到黑马币技术分主题
中级黑马, 积分 436, 距离下一级还需 564 积分
中级黑马, 积分 436, 距离下一级还需 564 积分
话说递归层次比较深的话容易造成stack overflow,还被认为效率不高,而且有人表示所有的递归都可以改写成循环,这是真的吗?
林锐博士的书中曾表示:所有的递归都可以改写成循环,而且认为递归的效率不高。
而王垠博士则认为递归比循环强。
“递归的数据总是需要递归的程序来处理。虽然递归有时候表现为另外的形式,比如循环(loop),但是“递归”这个概念比“循环”更广泛一些。有很多递归程序不能用循环来表达”
.cn/s/blog_5d90e82f01018ge9.html
“而其实递归比循环表达能力强很多,而且效率几乎一样。有些程序比如解释器,不用递归的话基本没法完成。”
.cn/s/blog_5d90e82f.html
王垠写解释器可是很在行的啊,对循环,递归的理解也应该不错吧。
该用户从未签到黑马币技术分主题
中级黑马, 积分 376, 距离下一级还需 624 积分
中级黑马, 积分 376, 距离下一级还需 624 积分
递归耗资源,如果用循环麻烦,用递归简单,用呗
该用户从未签到黑马币技术分主题
中级黑马, 积分 609, 距离下一级还需 391 积分
中级黑马, 积分 609, 距离下一级还需 391 积分
你应该好好理解一下递归的概念,递归多用于想处理多级文件夹或多级元素节点的地方,循环只是一种语句,递归的使用时的条件要比循环多,可以这样认为,递归是一种特殊的循环
该用户从未签到黑马币技术分主题
中级黑马, 积分 366, 距离下一级还需 634 积分
中级黑马, 积分 366, 距离下一级还需 634 积分
我是 进来学习一下的
论坛四周年勋章
四周年了,感谢现阶段还活跃在论坛的你们。
站长推荐 /4
总部接到信息后,总裁办的冯佳老师已第一时间赶往上海,所以大家有问题尽管提,但是造谣生事就不可取了。这是今天从上海发回的第一线报,准确无误差。大家应该把目光都放到这里来,一起来解决问题!
黑马论坛Andrid真正精华资源,受益Google-Andrid开发的大牛中级小菜鸟伙伴。一、精华级传智Android视频学习资源分享。二、Android新手篇入门分享。三、Android实战技术经验集.......
抄袭,这个词估计大家都理解。有句俗语是这么说的:天下文章一大抄,看你会抄不会抄。今儿,我不跟大家谈其他的,我们就说说黑马这些年被别人抄袭的经历吧。旧的就不说了,说说最近的。其一、各学科的专题页被抄袭。其二......
一帖在手,说走就走,小马驹们看过来~是不是有一种点招社招傻傻分不清楚赶脚?是不是有一种黑马论坛黑马报名系统傻傻分不清楚赶脚?是不是有一种先付费后付费傻傻分不清楚赶脚?莫要担心,雪姐来解释一下!
Powered by
Copyright &什么是递归算法:对递归的理解_单元测试_领测软件测试网
什么是递归算法:对递归的理解
发表于:来源:Csdn作者:wangjinyu501点击数:
什么是递归算法:对递归的理解!递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,
  一、基本概念
  递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法是基于语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这样我们就可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。递归往往能给我们带来非常简洁非常直观的代码形势,从而使我们的编码大大简化,然而递归的思维确实很我们的常规思维相逆的,我们通常都是从上而下的思维问题, 而递归趋势从下往上的进行思维。这样我们就能看到我们会用很少的语句解决了非常大的问题,所以递归策略的最主要体现就是小的代码量解决了非常复杂的问题。
  递归算法解决问题的特点:
  1)递归就是方法里调用自身。
  2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
  3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
  4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
  在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。
  二、程序示例
  ①斐波纳契数列(Fibonacci Sequence)
  问题描述:求解Fibonacci数列的第n个位置的值?(斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、&&在数学上,斐波纳契数列以如下被以递归的方法定义:F1=1,F2=1,Fn=F(n-1)+F(n-2)(n&2,n&N*))。
  求解代码:
  [] view plaincopyprint?
  public class Fibonacci {
  * time:
  * author:王金宇
  * description:用递归实现斐波那契数列,但是此方法是嫉妒危险的,适用于求解比较小的位置数值
  public static void main(String[] args) {
  Fibonacci fibonacci=new Fibonacci();
  int result=fibonacci.fib(5);
  System.out.println(result);
  public int fib(int index){
  if(index==1||index==2){
  return 1;
  }else{
  return fib(index-1)+fib(index-2);
  public class Fibonacci {
  * time:
  * author:王金宇
  * description:用递归实现斐波那契数列,但是此方法是嫉妒危险的,适用于求解比较小的位置数值
  public static void main(String[] args) {
  Fibonacci fibonacci=new Fibonacci();
  int result=fibonacci.fib(5);
  System.out.println(result);
  public int fib(int index){
  if(index==1||index==2){
  return 1;
  }else{
  return fib(index-1)+fib(index-2);
  程序分析:这个实例是非常经典的实例,主要是利用递归实现了Fibonacci数列。这个递归算法的出口是在
  [java] view plaincopyprint?
  if(index==1 || index==2){
  return 1;
  if(index==1 || index==2){
  return 1;
  这个代码段上,如果程序的index符合条件就会停止进行递归。所以这个程序的运行流程是:
  刚才说了这个方法十几度危险的,为什么这么说,原因在于在这个递归里做了冗余的工作,如图,我们在f4里面已经计算了f2,可是f3里有同样计算了f2,以此类推那些冗余的工作,在数值比较小的情况下,计算机还是可以接受的。但是,当求解的数值比较大,它是成指数级增长的,所以不要再递归中做重复的工作。
  ②n的阶乘
  问题描述:求5的阶乘
  求解代码:
  [java] view plaincopyprint?
  public class Factorial_Five {
  * time:
  * author:王金宇
  * description:递归求n的阶乘
  public static void main(String[] args) {
  Factorial_Five factorial_Five=new Factorial_Five();
  int result=factorial_Five.factorial(5);
  System.out.println(result);
  public int factorial(int index){
  if(index==1){
  return 1;
  }else{
  return factorial(index-1)*
  public class Factorial_Five {
  * time:
  * author:王金宇
  * description:递归求n的阶乘
  public static void main(String[] args) {
  Factorial_Five factorial_Five=new Factorial_Five();
  int result=factorial_Five.factorial(5);
原文转自:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)

我要回帖

更多关于 递归法 的文章

 

随机推荐