`

递归 入门

阅读更多

以前在面试的时候偶尔遇到递归方面的程序题,最近有个朋友找工作也遇到了,看来递归在面试过程中也经常用到。递归最有名的就是斐波那契(Fibonacci)数列和汉诺塔,概念就不说了,简单的说就是自己调用自己。直接看程序,

在网上找了几个题:

      1.求数组中的最大数

package com.wayne.recursion;

/**
 * 采用递归(recursion)求数组中的最大数
 * 
 * @author Administrator
 */
public class RecursionArrayMaxValue {
	public static int getMaxValue(int arr[], int i) {
		if (i == 1) {
			return arr[i];
		} else {
			if (arr[i - 1] >= arr[i - 2]) {
				arr[i - 2] = arr[i - 1];
				return getMaxValue(arr, i - 1);
			}
			return getMaxValue(arr, i - 1);
		}
	}
}

 

package com.wayne.recursion;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class RecursionArrayMaxValueTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Test
	public void testGetMaxValue() {
		int arr[] = { 3, 23, 43, 23, 12, 23, 23, 43, 23, 1, 3, 54, 54 };
		int max = RecursionArrayMaxValue.getMaxValue(arr, arr.length);
		assertEquals(54, max);
	}

}

 
  2.1+2+3+...+n

package com.wayne.recursion;

/**
 * 采用递归(recursion)求1+2+3+...+n值
 * 
 * @author Administrator
 * 
 */
public class RecursionSum {
	public static int getSum(int n) {
		if (n == 1) {
			return 1;
		}
		return n + getSum(n - 1);
	}
}

 

package com.wayne.recursion;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class RecursionSumTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Test
	public void testGetSum() {
		int sum = RecursionSum.getSum(5);
		assertEquals(15, sum);
	}

}

 
  3.求n个整数的积

package com.wayne.recursion;

/**
 * 采用递归(recursion)求n个整数的积
 * 
 * @author Administrator
 */
public class RecursionProduct {
	public static int getProduct(int arr[], int i) {
		if (i == 2) {
			return arr[1] * arr[0];
		}
		if (i == 1) {
			return arr[0];
		}
		arr[i - 2] = arr[i - 1] * arr[i - 2];
		return getProduct(arr, i - 1);
	}
}

 

package com.wayne.recursion;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class RecusionProductTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Test
	public void testGetProduct() {
		int arr[] = { 3, 4, 5, 3, 2 };
		assertEquals(360, RecursionProduct.getProduct(arr, arr.length));
	}

}

 

当做完几个递归后就会发现用程序实现递归找到几个入口就好写了:

 

1.寻找特定规律

2.确定边界(终了)条件

3.注意返回结果的控制

不过对于很多复杂的问题将其简单化用递归来设计还是挺有难度的。对于我这样的菜鸟级的就只能慢慢爬了。

分享到:
评论

相关推荐

    递归入门教程

    ### 递归入门教程知识点详解 #### 一、递归概念与原理 递归是一种算法设计技巧,通过函数调用自身来解决问题。其核心在于将一个复杂问题分解为多个相似但规模更小的子问题,直到子问题简单到可以直接求解为止。...

    程序设计-C and C++的实现:第6章 函数和递归入门.pdf

    本章“函数和递归入门”主要探讨了如何利用函数进行模块化编程,以及递归的概念。 首先,复习控制结构是理解函数和递归的关键。死循环通常发生在循环条件始终为真的情况下,例如当循环变量没有正确更新或初始条件...

    1173 【函数】【递归】阿克曼(Ackmann)函数.cpp

    函数 递归 入门 代码如下: #include using namespace std; #define qfor(n) for(i=0;i;i++) #define qw(tc) while(tc--) #define pb push_back int akm(int m,int n){ if(!(m)){ return n+1; } if(m&&!(n)){...

    递归_递归_

    在编程领域,递归是一种强大的概念,它是指一个函数或过程在其定义中调用自身的行为。递归在解决复杂问题时特别有用,因为它允许我们把大问题...通过不断练习和理解递归的本质,即使是入门级新人也能逐步提升编程能力。

    百战程序员C++培训视频.zip

    38.递归入门 39.递归的构建方法- 40.递归与循环的关系 41.经典问题-生成全排列 ....... 源码&文档 对象篇:【文件数:58】,源码&文档 应用篇:【文件数:62】,源码&文档 进阶篇:【文件数:53】,源码&文档

    计算二叉树深度算法(递归、非递归)入门详解 C语言实现

    计算二叉树深度算法(递归、非递归)入门详解 C语言实现

    递归算法之入门,快速学懂递归算法

    递归算法是编程中一种非常重要的思想,尤其对于初学者来说,理解递归可能需要一些时间,但一旦掌握,它将极大地提升你的编程能力。在Java中,递归算法表现为一个方法在执行过程中调用自身,以此来解决复杂的问题。 ...

    计算二叉树深度算法(递归、非递归)入门详解

    1. **剪枝优化**:在递归计算深度时,如果发现某一子树深度已经超过了当前已知的最大深度,可以提前结束该子树的递归,避免不必要的计算。 2. **记忆化搜索**:对于重复计算的子问题,可以使用哈希表存储结果,避免...

    经典的分形入门程序-Koch曲线的递归算法

    **正文** 分形,一种在自然界中广泛存在的几何形态,具有自相似性和无穷复杂性,是数学、计算机科学和艺术的交汇点。...这个入门程序不仅适合初学者,也对有一定编程基础的人提供了一个有趣的探索分形世界的机会。

    多任务编程超入门-(8) 递归互斥量

    本篇主要介绍递归互斥量,这是C++和QT库中一个重要的同步原语,用于解决多线程间的互斥访问问题。递归互斥量允许同一线程在已经获取锁的情况下再次请求并获得该锁,而其他线程在该线程释放锁之前将被阻塞。 首先,...

    Python基础教程、Python入门教程之递归算法.doc

    Python基础教程、Python入门教程之递归算法 本文将详细介绍Python基础教程中的一种重要编程技巧—递归算法。递归是一种自下而上的解决问题的方法,它可以大幅简化代码,使代码看起来非常简洁,但递归设计却非常抽象...

    “递归函数”入门[归类].pdf

    递归函数是编程中一种非常重要的概念,尤其在软件开发领域有着广泛的应用。递归函数是一种函数,其特点是在函数的定义中直接或间接地调用自身,通过反复调用自身来解决复杂问题。理解递归函数的工作原理是成为一名...

    零基础入门深度学习(7) - 递归神经网络1

    【零基础入门深度学习(7) - 递归神经网络1】这篇文章是深度学习系列教程的一部分,适合初学者,特别是那些编程背景的人。该系列旨在让没有深度学习基础的读者能够快速入门,通过一系列文章逐步讲解相关概念。文章中...

    零基础入门深度学习(7) - 递归神经网络 - 作业部落 Cmd Markdown 编辑阅读器.pdf

    本篇文章主要讨论了深度学习中的一个重要话题——递归神经网络(Recursive Neural Networks, RNN),尤其适合处理具有层级结构的数据,如自然语言中的句子结构、图像中的场景层次等。 首先,文章指出深度学习对于...

    c#递归求和算法

    c#入门简单代码,适合新手,简单的递归求和实现。 主函数 static void Main(string[] args) { Class1 aa = new Class1(); Console.WriteLine("请输入待求阶乘的数:"); int n = Convert.ToInt32(Console....

    经典的分形入门程序--Canto三分集的递归算法

    总的来说,"经典的分形入门程序--Canto三分集的递归算法"是一个很好的起点,通过它你可以深入理解分形的美和数学的奥秘,同时锻炼递归编程技巧,为进一步探索计算机图形学和复杂系统提供坚实的基础。

    tr-educ递归.pdf

    它通常被包含在第一年的入门级计算机科学课程、第二年的数据结构课程以及第三年的算法设计与分析课程之中。虽然递归的优点被广泛地教授和讨论,但其潜在的问题往往被忽视,尤其是在教材中并未得到充分的讨论。 本文...

    递归函数论(罗莎.培特)

    递归函数论入门,罗莎培特著,莫绍揆译。内容涵盖全面,论证详细

    python实现汉诺塔递归算法经典案例

    学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,所以本人觉得可以写篇博客来表达一下自己的见解。这markdown编辑器还不怎么会用,可能写的有点格式有点丑啦,各位看官多多见谅. ...

Global site tag (gtag.js) - Google Analytics