【算法分享会】递归转非递归

背景:

公司的嵌入式小组织发起了活动,每周进行一次学习分享。每周一个小主题 + 少量的算法题,大家相互研究学习。
第一次分享会,共发起了如下几个算法题:

  • 旅行售货员问题
  • 括号匹配问题
  • 递归转非递归问题
  • 层次遍历问题
  • 河内之塔

    本文仅对“递归转非递归问题”进行了解。

    题目

    递归转非递归

当 m * n = 0 时, f(m, n) = m + n + 1
当 m * n != 0 时, f(m, n) = f(m -1, f(m, n -1))

原始求解代码

#include <stdlib.h>
#include <time.h>

int cnt = 0;

int mXn(int m, int n)
{
    return m + n + 1;
}

int fmn(int m, int n)
{
    cnt++;
    if (m*n == 0)
    {
        return mXn(m, n);
    }
    else
    {
        return fmn(m - 1, fmn(m, n - 1));
    }
}

int main()
{
    int m = 2, n = 3, value;
    clock_t startTime, finishTime;

    startTime = clock();
    value = fmn(m, n);
    finishTime = clock();

    printf("Value = %d, cnt = %d\r\n", value, cnt);
    printf("Used %lf s\r\n", (double)(finishTime - startTime) / CLOCKS_PER_SEC);

    return 0;
}

分析

在测试之前,把堆栈空间设置为了50M 。
这里写图片描述
当 m =3,n = 2 时, fmn 被调用了 369 次。
这里写图片描述
当 m 和 n 不断的增大时, 调用 fmn 的次数越来越多,内存开销急剧增加。
当 m = 4, n =4 时,已经报堆栈溢出。fmn被调用了 306,945,324 次。
这里写图片描述
因此,采用原始代码方式,是没办法在计算机运行的。
必须另找办法。

栈处理方法

下班再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值