有5个学生坐在一起,问第五个学生多少岁,他说比第四个学生大两岁。问第四个学生的岁数,他说比第三个学生大2岁。问第三个学生,又说比第二个学生大2岁。问第二个学生,说比第一个学生大2岁。最后问第一个学生,他说是10岁。请问第五个学生多大:
解题思路:
书上的答案:
C语言:
#include<stdio.h>
int age(int n)//求年龄的递归函数
{
int c;//c用作存放函数的返回值的变量
if(n==1)
{
c=10;
}else{
c=age(n-1)+2;
}
return(c);
}
int main()
{
int age(int n);//对age函数声明
printf("NO.5,age:%d\n",age(5));//输入第五个学生的年龄
}
C++:
#include<iostream>
using namespace std;
int age(int n) //求年龄的递归函数
{
if(n == 1)
{
return 10;
}
else
{
return age(n-1) + 2;
}
}
int main()
{
cout << "NO.5, age: " << age(5) << endl; //输出第五个学生的年龄
return 0;
}
JAVA:
public class StudentAge {
public static int age(int n) {
if(n == 1) {
return 10;
} else {
return age(n-1) + 2;
}
}
public static void main(String[] args) {
System.out.println("NO.5, age: " + age(5)); // 输出第五个学生的年龄
}
}
运行结果:
程序分析:
总结:
1.犯了什么错?
1.不小心把return语句写入else括号中
2.学到了什么
从这道题和我们的讨论中,我们可以学到以下几点:
1. **递归的概念**:递归是函数自己调用自己的过程。在这个例子中,我们用递归解决了一个连续年龄的问题。当正确使用时,递归可以简化某些问题的解决方法。
2. **基线条件的重要性**:在递归中,基线条件(或称为递归的停止条件)是至关重要的,避免函数无限制地调用自己。在这个例子中,当`n==1`时,我们有一个基线条件返回年龄为10。
3. **函数返回的重要性**:所有的函数,尤其是带有返回类型的函数,必须确保在所有的执行路径中都有返回值。遗漏返回值可能导致编译时或运行时错误。
4. **从一个语言到另一个语言的转换**:我们已经看到如何将一个问题的解决方案从C转换为C++,再转换为Java。虽然语法和某些细节可能会有所不同,但核心的算法和逻辑思维是可以跨语言应用的。
5. **问题诊断和调试技能**:当面对一个错误或未知的输出时,有必要仔细检查代码,找出问题的根源,并学会如何修复它。
6. **测试的重要性**:验证函数或程序的输出,确保它们符合预期,是软件开发中的重要步骤。在这个例子中,经过测试我们知道程序返回了预期的结果。
通过这种类型的编程练习和解决问题的经验,我们可以增强自己的编程技能、问题解决能力和调试技巧。