javase(2)_递归&迭代
一、递归
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
1、递归实现
/**求一个数的阶乘*/
int f(int num){
if(num==1||num==0){
return 1;
}else{
return num*f(num-1);
}
}
/**累加求和*/
int f(int num){
if(num==1){
return 1;
}else{
return num+f(num-1);
}
}
/**斐波那契数列*/
int f(int num){
if(num==1||num==2){
return 1;
}else{
return f(num-1)+f(num-2);
}
}
/*把一个十进制数转换为二进制*/
static void f1(int num){
if(num==0){
return;
}else{
f1(num/2);
}
System.out.print(num%2);
}
2、迭代实现
累加、累乘略
/*斐波那契数列*/
int f2(int num){
if(num==1||num==2){
return 1;
}
int n1=1,n2=1;
int target=0;
for(int i=0;i<num-2;i++){
target=n1+n2;
n1=n2;
n2=target;
}
return target;
}
/**一个十进制数转换为二进制*/
void f(int num){
ArrayList a=new ArrayList();
int n=0;
while(num!=0){
n=num%2;
a.add(n);
num=num/2;
}
for(int i=a.size()-1;i>=0;i--){
System.out.print(a.get(i));
}
}
四、递归和迭代比较
递归其实是方便了程序员难为了机器,递归的优点是可以使代码更简洁清晰,可读性好,且可以解决少数迭代解决不了的困难问题;缺点是递归有大量函数调用(产生额外时间开销)和栈内存的开辟(占用大量栈内存),对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终.
迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。所以所有的迭代可以转换为递归,但递归不一定可以转换为迭代.
非递归函数虽然效率高,但却比较难编程,而且相对来说可读性差。
现代程序设计的目标主要是可读性好。随着计算机硬件性能的不断提高,程序在更多的场合优先考虑可读而不是高效,所以,鼓励用递归函数实现程序思想。
javase(2)_递归&迭代的更多相关文章
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- SICP 关于递归迭代的重新理解以及尾递归的引入...
看了线性的递归和迭代以及树形递归迭代这部分的内容,感觉对递归和迭代又有了新的理解...所以记录一下,也算对这部分内容的总结吧. 首先书中提到的递归与迭代和我以前想的有点不一样,我感觉书中提到的递归和迭 ...
- 020--python函数基础知识考试(包括:函数_递归等知识)
1.列举布尔值为 False 的值 空,None,0, False, '', [], {}, () 2.写函数: 根据范围获取其中 3 和 7 整除的所有数的和,并返回调用者:符合条件的数字个数以及符 ...
- python基础-基础知识考试_day5 (包括:函数_递归等知识)
老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, '', [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有数的和, ...
- DNS 递归/迭代 原理
递归查询 递归:客户端只发一次请求,要求对方给出最终结果.一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结 ...
- LeetCode145 Binary Tree Postorder Traversal Java题解(递归 迭代)
题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...
- [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代
方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...
- 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈
题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...
随机推荐
- github新手使用
1.首先要先在github的官网注册一个属于自己的账号.https://github.com/ 2.注册完成后需要一些简单的设置,先创建一个属于自己的仓库,repository 3.创建仓库 4.如何 ...
- [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片
目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...
- Spring事件机制详解
一.前言 说来惭愧,对应Spring事件机制之前只知道实现 ApplicationListener 接口,就可以基于Spring自带的事件做一些事情(如ContextRefreshedEvent),但 ...
- JSP | 基础 | 连接数据库
package util; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.*; ...
- C# 基础之类与结构体的区别
1.语法上的区别是: 定义类使用关键字class,定义结构体用关键字struct 2.结构体中不可对声明字段进行初始化,但类可以 3. 类:如果没有为类显示的定义一个构造函数,c#编译器会自动生成一个 ...
- flask_context
定义全局的钩子函数 有的时候在处理请求之前和之后,执行某些特定的代码是很有用的,这就用到了请求钩子 例如在请求之前创建数据库连接或者redis连接:或者是系统里面用户请求处理之前先验证用户的身份,是否 ...
- UG 常用设置
Q01:UG制图,添加基本视图之后的中心线怎么去掉? A01:“菜单-->文件-->首选项-->制图-->视图-->公共-->常规-->□带中心线创建”,取消 ...
- 【aspnetcore】用ConcurrentQueue实现一个简单的队列系统
第一步:定义队列服务接口 public interface ISimpleQueueServer { /// <summary> /// 添加队列消息 /// </summary&g ...
- 19 标签:xml或者html
1 标签:xml或者html 1.1 使用XmlSlurper解析xml groovy处理xml非常容易.XmlSlurper 类用来处理xml.在处理xml方面,还有其他的处理方式,但 ...
- Ubuntu 18.10 使用VMware克隆后,克隆后的机器再手动更改interfaces配置文件后无法启动网络的解决办法
克隆过程就略过了 配置interfaces root@client02:~# vim /etc/network/interfaces # interfaces() ) and ifdown() aut ...