美文网首页
递归详解

递归详解

作者: 程序员快速修炼 | 来源:发表于2019-01-11 22:14 被阅读0次

什么是递归?具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。

比如怎么求n的阶(n*(n-1)*(n-2)*.....*1)我只需要知道结束条件到1时结束,那么这个时候我可以定义结束条件为n==1,此时如果我要求n的阶,我是不是可以分解为n*(n-1的阶)?

以此类推,n-1的阶是不是等于求n-1*(n-2)的阶?

现在我求3的阶,假设我定义的函数为fun(int n);

我传值为3,fun(3);

把3的阶分为3*2的阶层,把2的阶分为2*1的阶。

过程就由fun(3)=3*fun(2),fun(2)=2*fun(1);

fun(1)(n==1时)返回1变成

fun(1)=1,fun(2)=2*1,fun3=3*fun(2)=3*2*1;就解决了问题。

                                                                                                图片来自慕课网

代码就是:

#include

int fun(int n)

{

if(n==1) return 1;

return n*fun(n-1);

}

int main()

{

int i;

scanf("%d",&i);

printf("%d",fun(i));

return 0;

}

首先总结递归的特点:

(1)可以把一个旧问题分开变成一个新问题,且新问题与原问题有着相同的形式,例如fun(n)=n* fun(n-1);

(2)有可以结束的出口,就是必须要有个结束的条件.

递归的优势:代码更简洁清晰,可读性更好。

递归的缺点:电脑需要使用内存去记住你调用了多少个递归函数,需要耗费大量的运行空间。

给出几个经典例题:

Fibonacci数列用递归实现:

代码:

#include

int fun(int n)

{

if(n==1||n==2) return 1;

return fun(n-1)+fun(n-2);

}

int main()

{

int i;

scanf("%d",&i);

printf("%d",fun(i));

return 0;

}

递归实现汉诺塔:

                                                                              图片来自博客园 

代码:

#include

int fun(int n)

{

if(n==1) return 1;

return 1+2*fun(n-1);

}

int main()

{

int i;

scanf("%d",&i);

printf("%d",fun(i));

return 0;

}

分析:

汉诺塔,假设有n块木板。

那么我得先把n-1快木板的位置移动到第三根柱子上

然后我在移动第n块木板到第二根柱子上

然后再把第三根珠子上的n-1块木板移动到第二根柱子上。

于是return 1+2*fun(n-1).你也可以写成fun(n-1)+1+fun(n-1)

注意找到”出口“,出口就是n=1时,只需要移动一次.

---------------------------------------------------------------------

想了解更多,可以关注公众号"程序员快速修炼"

相关文章

  • 递归详解

    本文首发于 LOGI'S BLOG,由作者转载。 递归是一种应用十分广泛的编程技巧,很多数据结构和算法都可用递归实...

  • 递归详解

    什么是递归?具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小...

  • 递归详解

    ----------- 首先说明一个问题,简单阐述一下递归,分治算法,动态规划,贪心算法这几个东西的区别和联系,心...

  • Go递归详解

    递归 栈:先进后出函数执行完后,就会依次销毁。 总结: 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)...

  • 递归算法详解

    导论  小编之前在分享有关的算法时,把递归这一重要的算法设计思想给遗漏了。递归的学习绝对是一个持久战,没有人可以一...

  • 合并两个排序的链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 递归版 递归版详解 ...

  • sm2 国密算法 中 常数 乘以 点坐标 函数 详解

    完整代码参考链接:密码学算法之 SM2国密算法 部分代码: 递归函数详解:(这里显示了一个通常的递归函数过程伪代码...

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • 递归详解晋级 php

    递归的理解 递归的方式解决了,深度求解在内的八个经典问题,本文先简洁描述递归树包括阶乘斐波那契数列二分查找汉诺塔杨...

  • python 10天快速教程 Day4

    本节重点 递归函数 匿名函数 python内置函数 切片 列表生成式 内存地址 可变类型与不可变类型详解 公共运算...

网友评论

      本文标题:递归详解

      本文链接:https://www.haomeiwen.com/subject/yrifdqtx.html