最简单递归

PHP树形结构构建
本文介绍了一种使用PHP实现树形结构的方法。通过递归函数处理具有层级关系的数据集,将其转换为易于展示的树状格式。具体示例展示了如何从原始数据中构建出包含多个层级的树形结构。
 public function testAction(){
    $arr = [
        ['id'=>1,'pid'=>0,'name'=>'PHP'],
        ['id'=>2,'pid'=>0,'name'=>'JAVA'],
        ['id'=>3,'pid'=>0,'name'=>'Mysql'],
        ['id'=>4,'pid'=>1,'name'=>'php类'],
        ['id'=>5,'pid'=>1,'name'=>'echo方法'],
        ['id'=>6,'pid'=>2,'name'=>'java类'],
        ['id'=>7,'pid'=>3,'name'=>'select方法'],
        ['id'=>8,'pid'=>4,'name'=>'php实例'],
        ['id'=>9,'pid'=>8,'name'=>'php实例儿子'],
    ];
        print_r($this->tree($arr,1));

}
    private function tree(&$arr,$pid=0){
        static $tree=array();
        foreach($arr as $v){
            if($v['pid']==$pid){
                $tree[]=$v;
                $this->tree($arr,$v['id']);
            }
        }
        return $tree;
    }

### 递归的简单程序示例 以下是一个关于递归的简单程序示例,展示了如何使用递归来计算数字的阶乘。 #### 计算阶乘的递归函数 阶乘是指从1到该数的所有整数的乘积。例如,5的阶乘为 `5 * 4 * 3 * 2 * 1 = 120`。以下是使用递归实现阶乘计算的代码: ```java public class Factorial { public static int factorial(int n) { if (n == 0) { return 1; // 基本情况 } else { return n * factorial(n - 1); // 递归调用 } } public static void main(String[] args) { int number = 5; System.out.println("Factorial of " + number + " is: " + factorial(number)); } } ``` 上述代码中,`factorial()` 方法通过递归调用自身来计算阶乘[^3]。如果传入的参数 `n` 为 0,则返回 1(这是递归的基本情况);否则,它将调用自己来计算 `n-1` 的阶乘,并将其与 `n` 相乘,最终得出 `n` 的阶乘。 #### 计算数字和的递归函数 另一个简单的递归示例是计算从1到某个数字的所有整数之和。以下是实现此功能的代码: ```java public class SumAdd { public static int sumAdd(int n) { if (n == 1) { return 1; // 基本情况 } else { return n + sumAdd(n - 1); // 递归调用 } } public static void main(String[] args) { int number = 5; System.out.println("Sum of numbers from 1 to " + number + " is: " + sumAdd(number)); } } ``` 此代码片段展示了如何通过递归计算从1到给定数字的总和[^4]。如果 `n` 等于1,则返回1作为基本情况;否则,函数将调用自身以计算 `n-1` 的和,并将结果与 `n` 相加。 #### 水手分椰子问题的递归实现 以下是一个更复杂的递归示例,解决了水手分椰子的问题。此问题要求计算最初有多少个椰子,使得每个水手都能按照特定规则分得椰子[^5]。 ```c #include <stdio.h> int coconutProblem(int n, int total) { if (n == 0) { return total % (5 + 1) == 1 ? total : -1; // 最后一个水手的情况 } else { int remaining = total - 1; // 给猴子一个椰子 if (remaining % 5 != 0) { return -1; // 如果不能平分,则不满足条件 } int taken = remaining / 5; // 每个水手拿走的部分 int left = remaining - taken; // 剩下的椰子 return coconutProblem(n - 1, left); // 递归调用 } } int main() { int n = 5; // 水手数量 for (int i = 1; ; i++) { // 从1开始尝试所有可能的椰子总数 if (coconutProblem(n, i) != -1) { printf("Minimum number of coconuts: %d\n", i); break; } } return 0; } ``` 此代码实现了水手分椰子问题的递归解决方案。通过不断尝试不同的椰子总数,直到找到满足条件的最小椰子数。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值