FibonacciNumber

本文介绍了一个简单的Java程序,用于生成指定位置的斐波那契数。用户可以输入前两个斐波那契数及所需位置,程序将递归计算并返回该位置上的斐波那契数。
import java.io.*;
public class FibonacciNumber {
static BufferedReader keyboard=new BufferedReader(new InputStreamReader(System.in));
public static void main(String args[])throws IOException
{
int firstFibNum;
int secondFibNum;
int nth;

System.out.println("Enter the first Fibonacci number:");
firstFibNum=Integer.parseInt(keyboard.readLine());
System.out.println();

System.out.println("Enter the second Fibonacci number:");
secondFibNum=Integer.parseInt(keyboard.readLine());
System.out.println();



System.out.print("Enter the desired Fibonaccinumber:");
nth=Integer.parseInt(keyboard.readLine());
System.out.println();
System.out.println("The Fibonacci number at position"+nth+"is:"+rFibNum(firstFibNum,secondFibNum,nth));

}
public static int rFibNum(int a ,int b,int n){
if(n==1)
return a;
else if(n==2)
return b;
else
return rFibNum(a,b,n-1)+rFibNum(a,b,n-2);
}
}
你提到的这段代码: ```c // 如果没有任何数被打印 if (first) { printf("No Fibonacci number"); } ``` 我们来详细分析它的**作用、逻辑正确性以及背后的机制**。 --- ### ✅ 回顾上下文 在 `PrintFN(m, n)` 函数中,`first` 是一个标志变量(flag),初始值为 `1`,表示“尚未打印任何斐波那契数”。 - 每当成功打印一个在区间 `[m, n]` 内的斐波那契数时,就将 `first = 0` - 如果最终 `first` 仍然是 `1`,说明 **一个都没打印** → 区间内没有斐波那契数 所以这个判断: ```c if (first) { printf("No Fibonacci number"); } ``` 👉 含义是: > 如果 `first == 1`(即从未进入过打印分支),则输出提示信息:“没有符合条件的斐波那契数” --- ### ✅ 示例验证 #### 示例 1:`m=50, n=60` 在这个范围内: - 斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... - 55 < 50 ❌ - 89 > 60 ❌ → 没有落在 [50,60] 的斐波那契数 因此: - 不会执行任何 `printf("%d", ...)` 语句 - `first` 始终为 `1` - 最终执行:`printf("No Fibonacci number");` ✅ 正确! #### 示例 2:`m=1, n=10` 包含:1, 2, 3, 5, 8 → 至少会打印 `1`,于是 `first` 被设为 `0` 最终 `if (first)` 条件不成立 → 跳过提示语句 ✅ --- ### ✅ 为什么用 `first` 这个变量能同时实现两个功能? | 用途 | 实现方式 | |------|----------| | 控制输出格式(是否加空格) | 初始 `first=1`,第一次打印时不加前导空格 | | 判断是否需要输出“No Fibonacci number” | 结束后检查 `first==1` 表示未打印任何内容 | 💡 **一箭双雕!同一个变量承担双重职责** --- ### ⚠️ 注意事项:变量命名应更清晰 虽然逻辑正确,但 `first` 兼具两种含义容易引起误解。建议改名或注释清楚。 推荐写法: ```c int printed = 0; // 是否已打印至少一个数字 // 打印第一个数时: if (fib_num >= m && fib_num <= n) { if (!printed) { printf("%d", fib_num); printed = 1; } else { printf(" %d", fib_num); } } // ... if (!printed) { printf("No Fibonacci number"); } ``` 这样语义更清晰:`printed` 表示“是否已经打印”,比 `first` 更直观。 --- ### ✅ 总结 | 代码 | 解释 | |------|------| | `if (first)` | 等价于 `if (first != 0)`,即“还没有打印过任何数” | | `printf("No Fibonacci number");` | 提示用户没有找到满足条件的数 | | 整体逻辑 | 正确且高效,利用标志位实现“零输出检测” | 这是 C 语言中非常典型的编程技巧:**用一个整型变量作为布尔标志**来控制流程和输出行为。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值