什么是递归?用Java写一个简单的递归程序
递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决。
自定义递归函数,并确定函数的基本功能
例如Java从键盘输入一个数,求输入这个数的阶乘。这个时候把输入的数字作为形参
int diGuiTest(int n ){ }
找到递归函数循环结束条件
在求阶乘的时候,我们不妨做出如下思考,例如输入的n是5,那么5!是5 * 4 3 * 2 * 1,那是不是可以写成
n f(n-1)?,程序运行过程如下:
5* f(4)
f(4)相当于重新调用了函数,形参为4
5 * 4* f(n-1)
f(3)相当于重新调用了函数,形参为3
5 * 4* 3* f(n-1)
f(2)相当于重新调用了函数,形参为2
5 * 4* 3 * 2* f(n-1)
f(1)相当于重新调用了函数,形参为1
很容易发现,这时候如果递归调用到n为1的时候,就要结束调用自身
代码如下:
int diGuiTest(int n ){ if(n==1){ return 1; } else{ return n*f(n-1); } }
求1–100之间所有自然数的和
int sum (int n ){ if(n==1){ return 1 ; } else{ return n+sum(n-1); } }
斐波拉契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2) (n ≥ 2,n ∈ N*)
int fibonacci(int n ){ if (n<=1){ return n; } else { return fibonacci(n-1)+fibonacci(n-2); } }
汉诺塔问题
首先我们考虑最简单的情况:
将最上面的一块放到B,再将最下面一块放到C,再把最上面一块从B放到C即可
public class Hanio { public static void main(String[] args) { char A='A'; char B='B'; char C='C'; hannio(3,A,B,C); } static void hannio(int paltfrom,char A,char B, char C){ if (paltfrom==1){ move (A,C); }else { hannio(paltfrom-1,A,C,B);//上面两个盘子,通过C柱到B柱 move (A,C); hannio(paltfrom-1,B,A,C);// } } static void move(char A,char B){ System.out.println(A+"---->"+B); } }
到此这篇关于什么是递归?用Java写一个简单的递归程序的文章就介绍到这了,更多相关Java 递归内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
问题内容: 我一直在尝试将编程的递归作为一个概念进行研究(尽管我专门研究Java),而这正是我最好的理解: 例如,在现实生活中,递归是当我们将两个反射镜彼此相对放置并且它们之间产生的图像是递归的。 但是我在编程中没有得到这个算法吗?有人可以给我一个简化的例子来理解递归吗? 问题答案: 基本上,函数是递归的 函数具有简单的基本情况,何时 所有其他情况都有规则化简为基本情况。 例如,要计算阶乘:
递归是一种解决问题的方法,将问题分解为更小的子问题,直到得到一个足够小的问题可以被很简单的解决。通常递归涉及函数调用自身。递归允许我们编写优雅的解决方案,解决可能很难编程的问题。
我实现了一个非常简单的递归方法,将两个数相乘在一起。我很难理解递归的基本知识。 有没有人能向我解释(如果可能的话,逐行解释)这段代码是如何工作的?我尤其感到困惑的是,基大小写被写为返回0,而实际上返回的是实际的乘法。 谢谢你的帮助
问题内容: (希望)对某些人来说,这是一个非常简单的问题。 我有一个来自mySQL数据库的递归菜单,现在我的主要问题是: 创建URL的最佳方法是什么?我希望输入每行的标题,例如/ eggs / milk / bacon /。鸡蛋处于0级,例如:鸡蛋0,牛奶1,培根2。关于如何动态输出此内容的任何想法? 对于“ cletus”所说的这个问题,我几乎要去做些评论:PHP / MySQL- 建立导航菜单
在编写合并排序的递推方程时,我对第二项[T(n)=2T(n/2)θ(n)]的推导位置感到困惑。 从Coursera类中可以看出,第二项是由于递归调用之外发生的事情引起的。所以我的猜测是因为这是由于2个For循环,每个循环将上升到n/2,所以总数将计数到n: 任何帮助都将不胜感激。谢谢
我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?