高阶函数之函数作为参数

SICP 1.3.1  Procedures as Arguments,说明高阶函数之函数作为参数的原因:若干个函数拥有相似的算法或代码结构,对此加以抽象

(define (sum-integers a b)
  (if (> a b)
      0
      (+ a (sum-integers (+ a 1) b))))
(define (pi-sum a b)
  (if (> a b)
      0
      (+ (/ 1.0 (* a (+ a 2))) (pi-sum (+ a 4) b))))

于是:

(define (sum term a next b)

  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))


这里使用Java完成相同的工作,4.3.3 累积函数

Scheme使用高阶函数——函数作为参数型。Java 8前,比较笨拙些。Sum类是一个模板类,getSum(int a,int b)是模板方法,而next和item就是“大名鼎鼎的钩子”。

NextInterface, ItemInterface在你不愿意使用Java的λ表达式时可以不要,它们是函数接口(代码略)。

package higherOrderFunction;
public class Sum implements NextInterface, ItemInterface {
    public final double getSum(int a,int b){
        double sum=0;
        for(int i =a;i<=b; i=next(i)){
            sum+=item(i);
        }
        return sum;        
    }
    @Override
    public int next(int i) {return 0;}
    @Override
    public double item(int x){return 0;}
}

这个代码比较清单1,是要多几行代码。现在实现Sum_pi,pi求和。main方法你可以放在Test类中,它还实现了sum_integers

package higherOrderFunction;
public class Sum_pi extends Sum {
    @Override  public double item(int x) {
        return 1.0 / (x * (x + 2));
    }

    @Override    public int next(int i) {
        return i + 4;
    }

    public static void main(String[] a) {
        System.out.println("pi=" + 8 * new Sum_pi().getSum(1, 1000));
        System.out.println("sum_integers(1,10)=" + new Sum() {
            @Override public double item(int x) {
                return x;
            }

            @Override
            public int next(int i) {
                return ++i;
            }
        }.getSum(1, 10));
   }
}
使用Java的λ表达式,我们按照清单1,也定义模板类Sum的4个参数的是模板方法, Java中方法,再怎么样玩花招,必须属于某个类型,即使想尽一切办法简化。所以,参数是函数接口,而非函数。

    public final double getSum(int a,int b,NextInterface iNext,ItemInterface iItem){
        double sum=0;
        for(int i =a;i<=b; i=iNext.next(i)){
            sum+=iItem.item(i);
        }
        return sum;        
    }
而应用就简洁了:

System.out.println("sum_cube(1,10)="
                + new Sum().getSum(1, 10,(i)-> {return ++i;},(x)->{ return x*x*x;})
        );

pi=3.139592655589782
sum_integers(1,10)=55.0
sum_cube(1,10)=3025.0


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值