递归的lambda表达式

33 篇文章 3 订阅

递归意味着一个函数调用了自身。在Java中可以编写递归的lambda表达式,但是这个lamba表达式必须被赋值给一个静态变量或一个实例变量,否则会出现编译错误。

  • 赋值给静态变量实现阶乘函数
package org.example.recursive;

import java.util.function.IntUnaryOperator;

public class RecursiveFactorial {

    static IntUnaryOperator fact;

    public static void main(String[] args) {
        fact = n -> n == 0 ? 1 : n * fact.applyAsInt(n - 1);
        for (int i = 0; i < 10; i++) {
            System.out.println(fact.applyAsInt(i));
        }
    }
}

执行结果

1
1
2
6
24
120
720
5040
40320
362880
  • 赋值给实例变量实现斐波那契数列
package org.example.recursive;

import java.util.function.IntUnaryOperator;


public class RecursiveFibonacci {
    IntUnaryOperator fib;

    RecursiveFibonacci() {
        fib = n -> n == 0 ? 0 :
                n == 1 ? 1 :
                        fib.applyAsInt(n - 1) + fib.applyAsInt(n - 2);
    }

    int fibonacci(int n) {
        return fib.applyAsInt(n);
    }

    public static void main(String[] args) {
        RecursiveFibonacci fibonacci = new RecursiveFibonacci();
        for (int i = 0; i <= 10; i++) {
            System.out.println(fibonacci.fibonacci(i));
        }
    }
}

执行结果

0
1
1
2
3
5
8
13
21
34
55
lambda表达式是一种匿名函数,可以在需要函数对象的地方使用。lambda表达式可以递归调用自身,但是lambda无法推断其类型。为了实现lambda表达式递归调用,可以使用一个引用参数来引用自己,通过调用的方式来推测出引用的是什么类型。比如,可以使用一个引用参数来引用自身,并在lambda表达式递归调用该引用参数。例如,可以使用如下方式实现lambda表达式递归调用: ```cpp auto f1 = [](auto&& me, int j) -> int { if (j == 0) { return 0; } else { return me(me, j - 1); } }; cout << f1(f1, 5) << endl; ``` 在这个例子中,通过使用引用参数me来引用自身,实现了lambda表达式递归调用。这样,调用f1(f1, 5)就可以得到lambda表达式递归结果了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++使用lambda表达式递归](https://blog.csdn.net/qq_42987967/article/details/123800206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++11-lambda表达式](https://blog.csdn.net/weixin_45599288/article/details/123114579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lang20150928

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值