回调与递归有没有给小弟我解释下

回调与递归有没有给我解释下
回调与递归有没有给我解释下有没有人给我解释一下回调与递归,让我茅塞顿开,一下就明白是怎么回事
------解决方案--------------------
这种概念性的东西,网上应该有好多的吧

你先搜索一下看看吧,然后把你的理解给说出来
------解决方案--------------------
回调就是执行完一些列的操作之后,再调用需要回调的操作
递归,就相当于细胞分裂一样,分裂方式都是一样的,就是递归函数
当一个细胞按照一种方式分裂成两个,发现两个细胞还可以分裂,则两个细胞继续按照相同方式分裂
直至无法分裂,递归函数层层返回,方法调用结束。
------解决方案--------------------
递归和回调(invoke)

回调:你可以去看看struts2的源码中它的defaultstack就是用了回调,实际使用了栈

递归:你可以写一个fib
1 1 2 3 5 8 13.....
public int fib(n){
   if(n<3)
       return 1;

return fib(n-1)+fib(n-2);

}

------解决方案--------------------
你的意思是 “递归和回归” ?
回调是callback,我怎么觉得和递归没有必然逻辑关系?
------解决方案--------------------
简单说下
1,递归:函数自身调用自身,函数内部又使用到了该函数功能。
2,所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。

下面直接上代码便于你理解递归
public class digui {  
  
  
    public static void main(String[] args) {  
          
    int sum=getSum(3);  
    System.out.println("sum="+sum);  
          
    }  
    public static int getSum(int num){  
        if(num==1)  
            return 1;  
        return num+getSum(num-1);  
    }  
      
    /*下面也是一种递归方式。类似于show()通过method()直接调用show()方法。 
    public static void show(){ 
        method(); 
    } 
    public static void method(){ 
        show(); 
    }*/  
  
  
}  


那什么时候用递归呢?
答:功能被重复使用,但是每次该功能使用参与运算的数据不同时,可以考虑用递归方案解决。

------解决方案--------------------
回调:Callback

假设你自己写了一个带窗口的程序,里面有一个按钮
你希望用鼠标押下按钮的时候,调用自己定义的一个函数,在里面弹出一个对话框

如果不使用回调函数,最简单的设计方法就是,在你自己的函数中用循环一直监视鼠标是否被按下
如果按下了,就暂时退出循环,弹出对话框
之后还得再次进入循环监视鼠标事件是否发生,否则再次押下按钮时就没有反应了
这么设计有非常严重的性能问题,所有的程序的所有的控件都这么设计的话,
不管电脑配置多高都会直接死机

那么如何解决呢?
就是你自己设计的那个弹出对话框的函数(被称为回调函数)
在操作系统的鼠标押下事件中,登录一下自己的函数地址
这样当鼠标押下时,就会由系统的鼠标押下事件的主函数,主动的调用你自己定义的回调函数
性能的问题就解决了

如果还没有马上理解的话,下面还有更简单的思考方法
你去酒店入住,第二天一大早要赶飞机,想使用酒店提供的“叫醒服务”
你必须告诉酒店的服务人员,第二天早上6点用电话提示你起床【向系统登录回调函数】
由于你已经登录过了,到第二天早上6点,就会自动给你屋里的电话发送一个叫醒的提示消息
不用你自己每隔一段时间看一下是否到达6点了【这确实不太现实,也就是说没有回调机制基本上就没有Windows了,对不?】

递归:Recursion

简单的说就是一个函数自己调用自己
为什么需要这样的设计呢?
因为有时要简化一些算法,比较自然的就是输入一个数,求它的阶乘

对这个问题来讲,用普通循环当然也可以完成
但是 如果n为1,那么n的阶乘就是它自身,否则就累乘一下
下面就是一个具体的例子,试着运行一下就能理解递归了
大多数的递归问题可以转换为普通循环,但是递归的代码有时会更容易理解一些

import java.util.Scanner;
 
public class Factorial{
    public static void main(String[] args){
        Scanner keyboard = new Scanner(System.in);
        int n = keyboard.nextInt();
        System.out.println(factorial(n));
    }
 
    public static int factorial(int n){
        if (n==1){
           return 1;
        } else {
           return n * factorial(n-1);
        }
    }
}