方法基础知识
- 实参和形参的区别?
方法执行的过程:所有的函数都会在栈上运行,
栈:先进后出
例1:1-5阶乘的和
public static int facSum(int n) {
//求阶乘的和
int sum = 0;
for (int i = 1; i <= n ; i++) {
sum += fac(i);
}
return sum;
}
public static int fac(int n){
//求i的阶乘
int ret = 1;
for (int j = 1; j <= n; j++) {
ret = ret*j;
}
return ret;
}
public static void main(String[] args) {
//调用facSum方法
int ret = facSum(5);
System.out.println(ret);
}
注:每调用一次facSum方法,就会调用一次fac方法
- 实参和形参的关系
形参的改变不一定会影响实参 - 方法匹配原则
方法的参数个数,类型以及返回值类型都要匹配
方法重载
有时候需要用一个函数同时兼容多种参数的情况,就会使用到方法重载
条件:
(1) 方法名称相同
(2) 方法的参数不相同(个数,类型)
(3) 方法的返回值类型不影响重载
public static int add(int x,int y) {
return x + y;
}
public static int add(int x,int y,int c) {
return x + y + c;
}
public static double add(int x,double y) {
return x + y;
}
作业
-
计算1/1-1/2+1/3-1/4+1/5…+1/99-1/100的值
注: flg = -flg; //1 -1循环 -
编写程序数一下1-100的所有整数中出现多少个数字9【注意题目不是问有多少个数字有9】
分析:要么个位是9 要么十位是9
public static int nineOfNum(int n) {
int count = 0;
for (int i = 1; i <= n ; i++) {
if (i % 10 == 9) { //余数为9即个位数为9的数
count++;
}
if(i / 10 ==9){//除数为9即十位数为9的数
count++;
}
}
return count;
}
public static void main(String[] args) {
System.out.println(nineOfNum(100));
}
- 求出0-999之间的所有”水仙花数“并输出。(”水仙花数“是指一个三位数,其各位数字的立方和正好等于该数本身,如:153=1³+5³+3³,则153是一个”水仙花数“)
public static void func(int n) {
for (int i = 1; i <=n ; i++) {
int count = 0;
int tmp = i;//让 tmp 代替i,保证i还是原数123
//第一步 i是几位数 eg:123
while (tmp != 0) {
count++;
tmp = tmp/10;//12 1 0
}
tmp = i;//123
int sum = 0;
while (tmp != 0) {
sum = sum + (int)Math.pow(tmp%10,count);//Math.pow是double类型,需要强制类型转换为int Math.pow(底数,几次方)
tmp /= 10; //12
}
if (sum == i) {
System.out.println(i);
}
}
}
public static void main(String[] args) {
func(999999);
}
结果:
- 编写代码模拟三次密码输入的场景,最多能输入三次密码,密码正确,提示”登录成功“,密码错误,可以重新输入,最多输入三次,三次均错,则提示退出程序。
public static void login() {
Scanner scanner = new Scanner(System.in); //输入
int count = 3;
while (count != 0) {
System.out.println("请输入你的密码:");
String pass = scanner.nextLine(); //输入密码字符串
// if (pass == "123456") { 重点
if(pass.equals("123456")){ //用pass.equals()函数才能判断字符串输入的值是否与正确密码一致
System.out.println("登录成功");
break;
}else {
count--;
System.out.println("你还有"+count+"次机会");
}
}
if (count==0) {
System.out.println("你没有机会了!");
}
}
public static void main(String[] args) {
login();
结果:
- 写一个函数返回参数二进制中1的个数 比如:15 :0000 1111 有 4个1
public static int oneOfNum(int n) {
int count = 0;
while (n != 0) {
n = n & (n-1);
count++;
}
return count;
}
public static void main(String[] args) {
System.out.println(oneOfNum(-1));//32
System.out.println(oneOfNum(6));//2
System.out.println(oneOfNum(11));//3
}
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
public static void func2(int n) {
//偶数
for (int i = 31; i >= 1; i-=2) {
System.out.print(((n>>i)&1)+" ");
}
System.out.println();
for (int i = 30; i >= 0; i-=2) {
System.out.print(((n>>i)&1)+" ");
}
}
public static void main(String[] args) {
func2(11);
}
结果:
- 输出一个整数的每一位
public static void print(int n) {
while (n!=0) {
System.out.println(n%10);
n = n/10;
}
}
public static void main(String[] args) {
print(123);
}
结果:
- 打印X图形
public static void func3(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j <n; j++) {
if (i == j) { //行=列
System.out.print("*");
} else if (i == n-1-j) { //行+列=n-1
System.out.print("*");
}else {
System.out.print(" ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNextInt()) {
int n = scan.nextInt();
func3(n);
}
}
结果:
递归
一个方法在执行过程中调用自身,就称为递归。函数自己调用自己,要有一个趋于终止的条件。
递归练习
- 按顺序打印一个数字的每一位数字
public static void print(int n){
if (n > 9) {
print(n/10);
}
System.out.println(n%10);
}
public static void main(String[] args) {
print(3456);
}
结果:
- 递归求1+2+3…+10
public static int sum(int n){
if (n==1) {
return 1;
}
return n+sum(n-1);
}
public static void main(String[] args) {
System.out.println(sum(10));
}
- 写一个递归方法,输入一个非负整数,返回组成它的数字之和。
public static int func2(int n){
if (n < 10) {
return n;
}
return n % 10 + func2(n/10);
}
public static void main(String[] args) {
System.out.println(func2(123));
}
- 斐波那契数列 1 1 2 3 5 8…
方法1:递归,重复计算多,程序执行效率低
public static int fib1(int n){
if (n == 1||n == 2) {
return 1;
}
return fib1(n-1)+fib1(n-2);
}
方法2:循环,执行效率高
public static int fib2(int n){
if (n == 1||n == 2) return 1;
int a = 1;
int b = 1;
int c = 0;
for (int i = 3; i <= n ; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}