1、课本上的练习
public class TestDemo {
/**
* 递归 练习:输入一个非负整数,返回组成它的数字之和.
* 例如,输入 1729,
* 则应该返回1+7+2+9,
* 它的和是19
*/
private static int sum(int n){
if(n<1) return 0;
return n%10+sum(n/10);
}
public static void main(String[] args) {
System.out.println(sum(1729));
}
/**
* 递归 练习:求 1+2+...+10
*/
public static int add(int n){
if(n==1){
return 1;
}
return n+add(n-1);
}
public static void main3(String[] args) {
System.out.println(add(3));
}
/**
* 递归 练习:按顺序打印一个数字的每一位 --------------看 png
*/
public static void func(int n){
if(n > 9){
func(n/10);
}
System.out.print(n%10+" ");
}
public static void main2(String[] args) {
func(2136);
}
/**
* 递归 引例: 阶乘
* @param
*/
public static int fac(int n){
if(n==1) return 1;
return n*fac(n-1);
}
public static void main1(String[] args) {
System.out.println(fac(5));
}
}
2、老师讲解
import java.util.Scanner;
import java.lang.String ;
import java.util.Random ;
public class HomeWork_4{
/**
* 求斐波那契数列的第n项。
* f3 = f2 + f1;//关键点
*/
public static int fibonacci(int n){
if(n <= 0){
return -1;//标识当前 n 不合法
}
if(n==1 || n==2){
return 1;
}
int f1 = 1;
int f2 = 1;
int f3 = 0;
for(int i = 3;i <= n; i++){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
public static void main5(String[] args) {
System.out.println(fibonacci(3));
System.out.println(fibonacci(4));
}
/**
*创建方法求两个数的最大值max2,随后再写一个求上个数的最大值的函数max3.
* 要求: 在max3这个函数中,调用max2函数
*/
public static int max2(int a,int b){
return a>b ? a : b;
}
public static int max3(int a,int b,int c){
return max2(max2(a,b),c);
}
public static void main4(String[] args) {
System.out.print("请输入数据:");
Scanner scan = new Scanner(System.in);
int num1 = scan.nextInt();
int num2 = scan.nextInt();
int num3 = scan.nextInt();
System.out.println("较大值:"+max3(num1,num2,num3));
}
/**
* 求 N 的阶乘 。
*/
public static void main3(String[] args) {
System.out.print("请输入一个整数:");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int result = 1;
for(int i = 1;i<=n;i++){
result *= i;
}
System.out.println(n+"的阶乘为:"+result);
}
/**
* 调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
* -----------------------------------------------------定义两个下标,i、j
* -----------------------------------------------------i存储偶数,j存储奇数
* -----------------------------------------------------然后交换i和j位置
*/
public static void reSort(int[] arr){
int i = 0;
int j = arr.length - 1;
while (i < j){
//当 i,j没有相遇时 进入循环
while(i<j && arr[j] % 2==0) {
//i<j : i,j不能相遇
j--;
}
while(i<j && arr[i] % 2!=0) {
//i<j : i,j不能相遇
i++;
}
//进行交换
int tmp=arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
public static void main2(String[] args) {
int[] arr = {
1,2,3,4,5,6,7};
reSort(arr);
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+" ");
} System.out.println();
}
/**
*有一组数据,只有一个数字是出现一次,其他是两次,请找出这个数字。------->利用运算符
*------------------------------------------------------------------>两个相同的数字“异或”为 0
*------------------------------------------------------------------>任何一个数字 “异或” 0 = 它本身
*/
public static void main1(String [] args) {
int[] arr = {
1, 1, 2, 2, 3, 4, 4};
int num = findNum(arr);
System.out.println(num);
}
public static int findNum(int[] arr){
int ret = 0;
for(int i = 0;i < arr.length;i++){
ret ^= arr[i];
}
return ret;
}
}