递归小例子

一个递归的小例子,在函数内部调用函数本身

var box = function(num){
        if(num <= 1){
            return 1;
        }else{
            return num * box(num - 1);
        }
    }
    alert(box(4));

输出:24 >>> 4*3*2*1。


假如box函数名字被修改,那么内部的调用函数本身的函数名也需要修改,为了避免修改内部函数修改,可以将内部调用函数本身改为:arguments.callee(调用函数本身)


var box = function(num){
        if(num <= 1){
            return 1;
        }else{
            return num * arguments.callee(num - 1);
        }
    }
    alert(box(4));

输出与上面一样:24 >>> 4*3*2*1


在 Java 中,递归是一种常见的编程技术,指的是一个方法直接或间接调用自身。递归适用于可以分解为多个子问题的场景,每个子问题的解决方式与原问题相同或相似。以下是几个简单的递归方法示例。 ### 阶乘计算 阶乘是递归的经典示例之一。阶乘的定义是 `n! = n * (n-1)!`,其中 `1! = 1` 是基线条件。 ```java public static int factorial(int n) { if (n == 1) { return 1; // 基线条件 } else { return n * factorial(n - 1); // 递归调用 } } ``` ### 累加求和 递归也可以用于求解 `1 + 2 + 3 + ... + n` 的和。该问题可以分解为 `n + sum(n-1)`,其中 `sum(1)` 的值为 `1`。 ```java public static int sum(int n) { if (n == 1) { return 1; // 基线条件 } else { return n + sum(n - 1); // 递归调用 } } ``` ### 字符串反向输出 递归可以用于反向输出字符串的每个字符。通过递归进入字符串的末尾,再逐层返回并输出字符。 ```java public static void reverse(int n, String str) { if (n == str.length()) { return; // 基线条件 } reverse(n + 1, str); // 递归调用 System.out.print(str.charAt(n)); // 逐层输出字符 } ``` ### 递归的实现原理 递归的执行过程涉及**进栈**和**出栈**操作。每次递归调用,程序会将当前状态压入调用栈中,直到满足基线条件后,再逐层返回并执行栈顶的操作。递归的深度受限于 JVM 的栈空间,因此递归深度过大会导致栈溢出(`StackOverflowError`)。 ### 相关问题 递归编程需要注意以下几点: 1. **基线条件**:递归必须包含一个或多个基线条件,以防止无限递归。 2. **递归深度**:递归调用的次数不能过多,否则会导致栈溢出。 3. **性能优化**:某些递归问题可以通过**尾递归优化**或**迭代**方式提升性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值