0713(008天 函数式编程)

0713(008天 )

每日一狗(奥利与奥斯卡)

在这里插入图片描述

主标题

习题讲解

// 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
double res = 0;
boolean flag = true;
for (int i = 1; i <= 100; i++) {
    if (flag) {
        res += 1.0 / i;
    } else {
        res -= 1.0 / i;
    }
    flag = !flag;
}
System.out.println(res); // 0.688172179310195
}
// 编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误,可以重新输 入,最多输入三次。三次均错,则提示退出程序
Scanner sc = new Scanner(System.in);
String password = "123456";
int count = 0;
while (count < 3) {
    System.out.println("请输入登录口令");
    String ss = sc.nextLine();
    if (ss.equals(password)) {
        System.out.println("登录成功");
    } else {
        count++;
        System.out.print("登录口令有误!");
        if (count == 3) {
            System.out.println("退出应用");
        }
    }
}
sc.close();
// 输出9*9的乘法口诀表
int i, j;
for (i = 1; i < 10; i++) {
    for (j = 1; j <= i; j++) {
        System.out.print(i + "×" + j + "=" + i * j + "\t");
    }
    System.out.println();
}
// 有一个有钱的神经病,他往银行里存钱,第一天存1元,以后每天比前一天多存50%,完成下列计算任务
// 		他存到第几天,当天存的钱会超过10元
// 		一个月(30天)后,他总共存了多少钱
double qian = 1;
double sum = 0;
int days = 0;
while (true) {

    sum += qian;days++; // 同时间进行
    qian = 1.5 * qian;

// 啥时候能存到10块钱
//	if (sum > 10) {
//	System.out.println(days); // 5
//	break;
//	}
// 30天竟然存了 30万
    if (days == 30) {
        System.out.println(sum); // 383500.1184657682
        break;
    }

}

// ================ 另一个版本 =================
float qian = 1;

int day = 1;
while (qian < 10) {
    {
        qian *= 1.5;
        day++;
    }
}
System.out.println("第" + day + "天就当天存储钱数为"); // 7
float res = 0;
qian = 1;
day = 1;
for (int i = 0; i < 30; i++) {
    res += qian;
    qian *= 1.5;
    day++;
}
System.out.println("第" + day + "天共存储钱数为" + res); // 383500.16

// 有一个400米一圈的操场,一个人要跑10000米,第一圈50秒,其后每一圈都比前一圈慢1秒,按照这个规则计算跑完10000米需要多少秒
// TODO Auto-generated method stub
int longSum = 0; // 已经跑了多少米
int sumTime = 0; // 已经用了多长时间
int time = 50; // 跑着一圈要用多长时间
final int ROUND = 400; // 操场长度
while (true) {
    longSum += ROUND; // 总长度累加
    sumTime += time++; // 总时间累加、一圈用时修正
    if (longSum >= 10000) { // 总长度达到 10000 米有退出
        System.out.println(sumTime);
        break;
    }
}
// 井里有一只蜗牛,他白天往上爬5米,晚上掉3.5米,井深56.7米。计算蜗牛需要多少天才能从井底到爬出来

1. 自定义方法

函数

1.1 基本概念(函数)

作用:

  • 简化代码
  • 提高代码的可读性、可维护性、复用性、安全性

语法格式(目前来说):

  • public static:公共的静态的
  • 返回值类型:定义返回值类型,如果定义了非viod类型,则必须返回一个对应类型的对象
  • return:中断函数执行,并返回指定类型的对象给程序的调用者。
public static 返回值类型 方法名(参数类型 参数名称,...){
    方法体;
    ...;
    return 返回给调用者的数据(类型要与上面定义的相同或者要能进行隐式转换)
}

方法的调用:

  • 实参和形参的类型必须一一对应,
  • 函数返回值小转大:自动类型转换
  • 函数实参小转大:自动类型转换

特殊关键字

  • break:用来终止switch或者距离最近的循环
  • continue:用来终止本次循环,进图下次循环
  • retrun:
    • 用来终止他所在的一个方法的执行
    • 返回给调用者后边跟的对象
  • system.exit(); 用来终止程序的运行

1.2 递归调用:

递归的思想是将问题转化为规模更小且与原问题解决方法相同的小问题。

定义:

  • 自己调用自己
  • 调用了一圈有调回自己了

应用条件:

  • 原问题的解可以由多个类似的子问题的解 计算而来

小试牛刀(计算阶乘)

package com.ketanglianxi;

public class T03阶乘和递归 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long res = jieCheng(5);
		System.out.println(res);
	}

	public static long jieCheng(int k) {
		if (k == 1) {
			return 1;
		} else {
			return k * jieCheng(k - 1);
		}
	}

}

纯递归实现阶乘和

package com.ketanglianxi;

public class T08阶乘和递归 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(leiJia(15)); // 1.401602636313E12
	}

	public static double jieCheng(int i) {
		if (i == 1) {
			return 1;
		}
		return jieCheng(i - 1) * i;
	}

	public static double leiJia(int i) { // 实现循环
		if (i == 1) {
			return jieCheng(i);
		}
		return leiJia(i - 1) + jieCheng(i); // 小一份的数加上当前数的阶乘值
	}
}

1.3 典型案例

  1. 斐波那契数列(1,1,2,3,5,8,13,21,34…)黄金分割数列,兔子序列
package 递归调用;

public class T001斐波那契数列兔子序列 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(feiBoNaQieShuLie(10)); // 55
	}

	public static int feiBoNaQieShuLie(int i) {
		if (i == 1) {
			return 1;
		}
		if (i == 2) {
			return 1;
		}
		return feiBoNaQieShuLie(i - 1) + feiBoNaQieShuLie(i - 2);
	}
}
  1. 上台阶

一次一步或者一次两部

一百级一共有多少中办法

// 	10 	89
// 	20	10946
// 	100	
package com.ketanglianxi;

public class T05花式爬楼梯 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(paLouTi(10));
	}

	public static int paLouTi(int i) {
		if (i == 1) {
			return 1;
		}
		if (i == 2) {
			return 2;
		}
		return paLouTi(i - 1) + paLouTi(i - 2);
	}
}
  1. 汉诺塔
  • 将 n-1 个盘子从柱1放到柱2
  • 将一个盘子从柱1放到柱3
  • 将柱2的n-1个盘子放到柱3
  • f(n) = 2f(n-1) + 1;
package 递归调用;

public class T002汉诺塔 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(hanNuoTa(64)); // 1.8446744E19
	}

	public static float hanNuoTa(int i) {
		if (i == 1) {
			return 1;
		}
		return 2 * hanNuoTa(i - 1) + 1;
	}
}
  1. 猴子吃桃

每天吃一半的桃子零一个

问:第十天剩下一个桃子,第一天有几个桃子?

// f(n) = f(n-1)/2 - 1;
// 2f(n) = f(n-1) -2;
// f(n-1) = 2f(n) + 2;

练习题文件地址

2022/07/13 17:43 270 T01结乘和.java
2022/07/13 15:29 462 T02阶乘和.java
2022/07/13 16:30 336 T03阶乘和递归.java
2022/07/13 16:32 306 T04递归累加.java
2022/07/13 17:05 377 T05花式爬楼梯.java
2022/07/13 17:05 403 T06斐波那契数列兔子序列.java
2022/07/13 17:30 296 T07猴子吃桃.java
2022/07/13 17:41 452 T08阶乘和递归.java
2022/07/13 18:05 519 T09十进制转换八进制.java

1.4 课后作业

  1. 假如一个小球从100米高度自由落下,每次落地后就反跳回原高度的一半。那么求它在第10次落地时,共经过多少米?第10次反弹多高?
package com.kehouti;

public class T01弹球 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		float sum = 100;
		float high = 100;
		int num = 1;
		System.out.println("第1次下降" + high);
		while (true) {
			if (num == 10) {
				break;
			}
			num++;
			high /= 2;
			System.out.println("第" + (num - 1) + "次回弹" + high);
			sum += high;
			System.out.println("第" + num + "次下降" + high);
			sum += high;
		}
		System.out.println("第" + num + "次回弹" + high / 2); // 0.09765625
		System.out.println("小球在第10次落地时一共经过了" + sum + "米"); // 299.60938
	}
}

  1. 十进制转8进制和16进制
package com.kehouti;

public class T02十六进制转换 {
	final static String ss = "0123456789abcde";

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(shiToShiLiu(50)); // 0X32
		System.out.println(0X32); // 50
	}

	public static String shiToShiLiu(int i) {
		if (i < 16) {
			return "0X" + ss.charAt(i);
		}
		return shiToShiLiu(i / 16) + ss.charAt(i % 16);
	}
}

扩展小芝士

  • 最大公约数可以是1
  • 不到万不得已不用递归,随着递归的深度增加,占得内存会越来越多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值