栈的应用 斐波那契的递归

博客主要借助两张图讲解递归的先后顺序,包括由底到顶的入栈过程以及回退的出栈过程,帮助读者理解递归机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两张图搞懂递归的先后顺序

int Fun(int i){
 
   if( i == 1 ) return 1;

   return i + Fun( i - 1 )  ;
}

由底到顶入栈过程 

回退,也就是出栈过程

 

### C语言使用实现递归计算斐波那契数列 在C语言中,可以利用显式的结构模拟函数调用的行为来实现非递归版本的斐波那契数列计算。这种方法不仅能够避免传统递归带来的大量重复计算问题,还能有效防止因递归过深而导致的堆溢出。 #### 数据结构设计 为了存储每次迭代中的状态信息,定义一个结构体`StackNode`用于表示节点,它保存当前处理的是哪一个位置以及该位置对应的两个前置数值: ```c typedef struct StackNode { int n; long fib_n_minus_1; long fib_n_minus_2; } StackNode; ``` 接着创建一个链表形式的用来管理这些节点对象,并初始化必要的变量和辅助函数来进行入、出操作[^1]。 #### 主要逻辑流程 通过遍历目标索引范围内的每一个自然数,在每一步都将新的待解决问题压入内;当遇到可以直接得出结果的情况(即基底条件),则弹出顶元素并更新相应的中间结果直到最终得到所求解的位置处的结果值。 下面是完整的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义结点结构 typedef struct StackNode { int n; long fib_n_minus_1; long fib_n_minus_2; struct StackNode* next; } StackNode; void push(StackNode** top_ref, int n, long a, long b); long pop(StackNode** top_ref); int fibonacci_with_stack(int num) { if (num <= 0) return 0; // 初始化 StackNode* stack = NULL; push(&stack, num, 0L, 1L); while(stack != NULL){ StackNode* current_node = stack; if(current_node->n == 0 || current_node->n == 1){ break; } if(current_node->next == NULL){ push(&(current_node->next), current_node->n - 1, current_node->fib_n_minus_2, current_node->fib_n_minus_1 + current_node->fib_n_minus_2); continue; } // 更新父级结点的数据成员 current_node->fib_n_minus_1 += current_node->next->fib_n_minus_1; current_node->fib_n_minus_2 = current_node->next->fib_n_minus_2; free(current_node->next); current_node->next = NULL; } return stack->fib_n_minus_1; } void push(StackNode** top_ref, int n, long a, long b) { StackNode* new_node = (StackNode*)malloc(sizeof(StackNode)); new_node->n = n; new_node->fib_n_minus_1 = a; new_node->fib_n_minus_2 = b; new_node->next = (*top_ref); (*top_ref) = new_node; } long pop(StackNode** top_ref) { StackNode* temp; long res; if(*top_ref == NULL) exit(-1); temp = *top_ref; res = temp->fib_n_minus_1; *top_ref = ((*top_ref)->next); free(temp); return res; } int main() { int i; for(i=0;i<10;++i){ printf("%d ", fibonacci_with_stack(i)); } } ``` 这段程序展示了如何借助自定义的数据结构来替代传统的递归来完成斐波那契序列的构建过程。这种方式既保留了原生递归算法易于理解的优点,又克服了其性能上的缺陷[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值