Java基础05(函数)

1.函数(方法)

     定义:主要用于封装具有独立功能的一段代码,由函数名称。修饰符、返回值类型、参数列表和方法体构成

     语法格式如下:

       修饰符     类型修饰符      返回值类型   函数名(参数列表){

            函数体

             return  返回值;

      }

      权限修饰符:标记谁能用,谁不能用       public protected 默认 private
      类型修饰符:标记函数的一些特殊含义    static 默认 native synchronized 
      函数名:给该段代码起名称
      参数列表:用于接收调用者传递进来的数据 以便函数内部使用
                      (参数类型1 形参1,参数类型2 形参2....)
                        参数列表 可有可无
        函数体:就是你所封装的那个具有独立功能的那段代码
        return:仅仅表示结束当前函数(函数弹栈)
                    如果函数有返回值 则return必须写出来
                      如果函数没有返回值,则return可以不明显的写出来 但是一定存在(隐藏)
         返回值:这段代码计算的结果 结果可有可无
         返回值类型:就是返回值是的数据类型(兼容即可) 
                               如果没有返回值 则返回值类型写void 

         我们来看一下一个函数的定义,该函数找出两个整数中哪个数比较大。这个名为 max 的方法有两个 int 型参数numl                                                              mum2, 函数返回两个数中较大的一个。下图就很详细解释了函数的组成

          

    注意: 在方法头中,需要对每一个参数进行独立的数据类型声明。例如:max(int num1,int num2)是正确的,而 max(int                            num1,num2)是错误的。

              方法能够带来代码的共享和重用。

              对带返回值的方法而言,return 语句是必需的。下面代码中显示的方法在逻辑上是正确的,但它会有编译错误,因为                           Java 编译器认为该方法有可能不会返回任何值。

public static int sum(int a,int b){
    
   int sum = a+b;


}

           

                 void 方法不需要 return 语句,但它能用于终止方法并返回到方法的调用者。使用  return;

案例:

代码如下:

import java.util.Scanner;

class Class25{
    public static void main(String args[]){
        System.out.print("请输入一个整数:");
        Scanner Sc = new Scanner(System.in);
        long num = Sc.nextInt(); 
        long sum = sumDigits(num);
         System.out.println("的各位数字之和为"+sum); 
    }
    public static long sumDigits(long n){
       
        long sum = 0;
        while(true){
            long a=n%10;
            n = n/10;
            sum = sum+a;
            if(n==0){
                break;
            }
        }
        return sum;
    }
}

 

2、函数重载:重载函数使得你可以使用同样的名字来定义不同函数。

       好处:函数重载可以使得程序更加清楚,以及更加具有可读性。执行同样功能但是具有不同参数类型的方法应该使用同样的                   名字。

                  对函数的参数进行拓展。

      判断函数到底是不是重载:看参数类型的排列组合(个数,顺序)。

     

public static int max(1nt numl, int num2){

}
public static double max(double numl, double num2){

}
public static double max(double numl, double num2 ,double num3){

}

      注意事项:被重载的方法必须具有不同的参数列表不能基于不同修饰符或返回值类型来重载函数

                        有时调用一个方法时会有两个或更多可能的匹配但是,编译器无法判断哪个是最精肩的匹配这称为歧义调                           用( ambiguous invocation)歧义调用会产生一个编译错误

   案例:求数的最大值

    代码如下:  

class Class01{
   public static void main(String args[]){
      System.out.println(max(3,4));              //
   
       System.out.println(max(3.0,4.5));         //
        
       System.out.println(max(3.0,4.5,6.5));     //

   }
    public static int max(1nt numl, int num2){   // 两个整形比大小
        
       if (numl > num2){
         return numl;
       }else{
         return num2;
        }
   }
   public static double max(double numl, double num2){   //两个double比大小
      if (numl > num2){
         return numl;
       }else{
         return num2;
        }
   }
   public static double max(double numl, double num2 ,double num3){    //三个double比大小

     return max(max(numl, num2), num3);
   }
    
}
 

 3、函数递归:从代码上来看 就是函数调用函数自己。

         递归的好处:递归主要是将大的问题逐步化解为小的问题进而解决,减少代码量。通常递归用于解决本质上有递归特性的问題,例如汉诺塔问題,及思瑞平斯基三角形。        

         递归的坏处:递归程序可能会用完内存引起一个 StackOverflowError

         注意:写递归时一定要清楚合适归(递归到那一层结束)

         递归练习:

            1.利用递归求解:1+2+3+4+.........+n的总和    

import java.util.Scanner;
class Home01{
   public static void main(String args[]){
      Scanner Sc = new Scanner(System.in);
      System.out.print("请输入一个数字:");     //提示用户输入一个数字
      int num  = Sc.nextInt();
      System.out.print("1到"+num+"的总和为"+sum(num));   //调用函数sum求1到num之和
    } 
   public static int sum(int num){
     if(num == 1){        //当num==1时递归结束
       return 1;
    }
     return sum(num-1)+num;  //调用自己
   }

}    

            2.打印斐波那契数列前20项:1  ,1 ,2  ,3, 5   ,8  ,13,21 。。。。。。

class Demo01{
    public static void main(String[] args){

      for(int i=1;i<=20;i++){                   //for循环打印出前10项斐波那契数列
            System.out.print(fib(i)+" ");  //求第i项
        }
    }
    //此函数求得只是第n项的值
    public static int fib(int n){       
        if(n==1||n==2){
            return 1;
        }
        return fib(n-1)+fib(n-2);
    }  
}

         如图给出了计算fib(4)时对fib进行的递归调用:

    

         3.汉诺塔问題

import java.util.Scanner;

class Demo01{
    public static void main(String args[]){
          Scanner Sc = new Scanner(System.in);
          System.out.print("请输入盘子的数量:");    //输入盘子的数量
          int num = Sc.nextInt();         
          HanLuo("x","y","z",num);                 //托板为x ,y  ,z
    } 
    public static void HanLuo(String from,String mid ,String to,int num ){
        if(num==1){                             //递归结束条件
            System.out.println(from+"到"+to);   //直接输出从from到to
        }else{
        HanLuo(from,to,mid,num-1);      //  将前n-1个盘子从from移到mid  借助to
        System.out.println(from+"到"+to);  //直接输出从from到to
        HanLuo(mid,from,to,num-1);      //将前n-1个盘子从mid移到to  借助from
        }
    } 
}

    

          

  

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值