带3个参数的递归实现斐波那契数列时输出全为0的问题
问题分析与修正方案
我来帮你定位代码里的问题,这两个关键错误导致了输出全是0:
1. 递归时完全忽略传入参数,每次都重置变量
你在fibo函数内部定义了int n1=0,n2=1,ele=0;,这意味着每次递归调用这个函数,不管你传入的a和b是什么,n1和n2都会被重新初始化为0和1。你传入的参数根本没起到作用,自然每次打印的都是初始值0。
2. 缺少递归终止条件
你的代码里只处理了n>=1的情况,但没有定义n<1时的终止逻辑,递归会一直调用fibo(n-1,...)直到栈溢出(不过在溢出前会一直打印0)。
修正后的代码
我们需要利用传入的a和b来维护斐波那契数列的当前状态,同时加上明确的终止条件:
#include<stdio.h> void fibo(int n ,int a ,int b) { // 终止条件:当需要输出的元素数量为0时停止递归 if(n < 1){ return; } // 打印当前的斐波那契数(也就是传入的a) printf(" %d", a); // 递归调用:传递下一组斐波那契数,同时减少需要输出的元素数量 fibo(n-1, b, a + b); } int main(){ fibo(10,0,1); return 0; }
代码逻辑说明
- 第一次调用
fibo(10,0,1):打印0,然后递归调用fibo(9,1, 0+1=1) - 第二次调用:打印
1,递归调用fibo(8,1,1+1=2) - 第三次调用:打印
1,递归调用fibo(7,2,1+2=3) - ……以此类推,直到
n减到0时停止递归
运行这段代码,你会得到正确的前10个斐波那契数:0 1 1 2 3 5 8 13 21 34
内容的提问来源于stack exchange,提问作者Suraj Bhandarkar
相关产品推荐
相关产品推荐

