源本科技 | 码上会

年龄递推问题

2026/01/26
12
0

题目

有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人,说比第一个人大两岁。最后问第一个人,他说是 10 岁。请问第五个人多大?

说明

这是一个典型的线性递推关系问题,也可以用递归思想来建模。

问题建模:

设第nn 个人的年龄为A(n)A(n),根据题意:

  • 基准条件:A(1)=10A(1) = 10

  • 递推关系:A(n)=A(n1)+2A(n) = A(n - 1) + 2,其中n=2,3,4,5n = 2, 3, 4, 5

这实际上是一个等差数列

A(n)=10+(n1)×2=2n+8A(n) = 10 + (n - 1) \times 2 = 2n + 8

验证:

  • A(1)=10A(1) = 10

  • A(2)=12A(2) = 12

  • A(3)=14A(3) = 14

  • A(4)=16A(4) = 16

  • A(5)=18A(5) = 18

因此,第五个人 18 岁


运行示例

第五个的年龄为18

👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

规律分析

人数nn

年龄A(n)A(n)

计算方式

1

10

给定

2

10 + 2 = 12

A(1)+2A(1)+2

3

12 + 2 = 14

A(2)+2A(2)+2

4

14 + 2 = 16

A(3)+2A(3)+2

5

16 + 2 = 18

A(4)+2A(4)+2

通项公式:A(n)=10+2(n1)=2n+8A(n) = 10 + 2(n - 1) = 2n + 8

所以A(5)=2×5+8=18A(5) = 2 \times 5 + 8 = 18


程序实现

方法一:迭代(直接求解)

public class Demo23 {
    public static void main(String[] args) {
        int age = 10; // 第一个人的年龄
        for (int i = 0; i < 4; i++) { // 后面4个人,每人+2
            age += 2;
        }
        System.out.println("第五个人" + age + "岁");
    }
}

方法二:递归(体现递推思想)

public class Demo23 {
    // 递归函数:求第 n 个人的年龄
    public static int getAge(int n) {
        if (n == 1) {
            return 10; // 基准条件
        }
        return getAge(n - 1) + 2; // 递归关系
    }

    public static void main(String[] args) {
        System.out.println("第五个人的年龄为" + getAge(5));
    }
}

方法三:数学公式(最优解)

public class Demo23 {
    public static void main(String[] args) {
        int n = 5;
        int age = 10 + (n - 1) * 2;
        System.out.println("第五个人" + age + "岁");
    }
}

补充知识

  • 此题是递归入门经典案例,与“斐波那契数列”“阶乘”并列为三大递归教学范例。

  • 虽然本题用循环或公式更高效,但使用递归有助于理解函数调用栈问题分解的思想。

  • 在实际开发中,若递归深度较大(如n>104n > 10^4),应优先考虑迭代以避免 StackOverflowError

  • 该模型可推广到任意等差序列的生成,例如:工资每年涨 500 元、树木每年长高 10 厘米等。

总结:本题虽简单,但清晰展示了递归思维数学建模的结合,是理解算法基础的重要一步。