C和C指针小记(十一)-递归和迭代优化

1、递归

C通过运行时堆栈支持递归函数的实现.
递归函数就是直接或间接调用自身的函数.
一个小例子:

/**
 使用递归将整型转换为ascii字符

 @param value 整型数
 */
void binary2ascii(unsigned int value) {
    unsigned int quotient;
    quotient = value / 10;
    if (quotient != 0) {
        binary2ascii(quotient);
    }
    putchar(value % 10 + '0');
}

2、两个递归运用和用迭代优化的例子

尾递归:递归调用出现在函数的尾部,并且之后不再执行任何任务
尾递归可以方便的转换为迭代.由于递归是非常耗费内存的(每次函数调用都会在内存中分配空间),内存频繁的分配回收严重影响程序的执行效率.


/**
 递归计算阶乘

 @param n 整数n
 @return 阶乘
 */
long factorial(unsigned int n){
    if (n <= 0) {
        return 1;
    }else{
        return n * factorial(n - 1);
    }
}


/**
 迭代计算阶乘

 @param n 整数n
 @return 阶乘
 */
long factorial_iteria(int n){
    int result = 1;
    while (n > 1) {
        result *= n;
        n -= 1;
    }
    return result;
}



/**
 递归计算斐波那契数
 效率非常低:计算fibonacci(10)时,fibonacci(3)重复计算了21次,计算fibonacci(30)时,fibonacci(3)计算了317811次
 @param n 整数n
 @return n的斐波那契数
 */
long fibonacci(int n){
    if (n <= 2) {
        return 1;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}


/**
 迭代求斐波那契数列
 
 @param n 整数n
 @return n的斐波那契数
 */
long fibonacci_iteral(int n){
    long result;
    long previous_result;
    long next_older_result;
    result = previous_result = 1;
    while (n > 2) {
        n -= 1;
        next_older_result = previous_result;
        previous_result = result;
        result = previous_result + next_older_result;
    }
    return result;
}


posted @   wjwdive  阅读(240)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示