方法+递归

本文详细解析了实参和形参的区别,强调了方法执行中栈的概念,并通过实例演示了阶乘求和、数字特性计数、水仙花数查找等。讨论了方法匹配、重载、递归等概念,涉及计算1/1-1/100的和、9在数字中的分布、三位数水仙花数的识别以及密码验证的逻辑。
摘要由CSDN通过智能技术生成

方法基础知识

  1. 实参和形参的区别?
    方法执行的过程:所有的函数都会在栈上运行,
    栈:先进后出
    在这里插入图片描述
    例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. 方法匹配原则
    方法的参数个数,类型以及返回值类型都要匹配

方法重载

有时候需要用一个函数同时兼容多种参数的情况,就会使用到方法重载
条件:

(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-1/2+1/3-1/4+1/5…+1/99-1/100的值
    在这里插入图片描述
    注: flg = -flg; //1 -1循环

  2. 编写程序数一下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));
    }
  1. 求出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);
    }

结果:
在这里插入图片描述

  1. 编写代码模拟三次密码输入的场景,最多能输入三次密码,密码正确,提示”登录成功“,密码错误,可以重新输入,最多输入三次,三次均错,则提示退出程序。
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. 写一个函数返回参数二进制中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
        }
  1. 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
  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);
        }

结果:
在这里插入图片描述

  1. 输出一个整数的每一位
  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);
        }

结果:
在这里插入图片描述

  1. 打印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);
        }
    }

结果:
在这里插入图片描述

递归

一个方法在执行过程中调用自身,就称为递归。函数自己调用自己,要有一个趋于终止的条件。

递归练习

  1. 按顺序打印一个数字的每一位数字
 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. 递归求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));
    }
  1. 写一个递归方法,输入一个非负整数,返回组成它的数字之和。
  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 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值