玩转递归

所谓递归可以说成函数调函数

如我们 return  eat3(n - 1) * 2 + 2 (大圣吃桃子)

下面上图看递归原理:

递归牵连到两个概念 压栈和出栈

看完图相信大家应该懂了是怎么回事(这么压栈内存可不少哦)

下面上吃桃子的代码:

  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(eat3(10));
        }

        public static int eat2(int n)
        {
            int a = 1;

            if (n == 1)
            {
                return 1;
            }
            else
            {
                a = eat2(n - 1) * 2 + 2;
            }

            return a;
        }

        //递归
        public static int eat3(int n)
        {
            //eat2方法简写三目表达式
             return n == 1 ? 1 : eat3(n - 1) * 2 + 2;
        }

        //递推
        public static int eat(int n)
        {
            int a = 1;

            for (int i = 2; i <=n; i++)
            {
                a = 2 * a + 2;
            }

            return a;

        }
}
时间: 2024-10-14 03:24:32

玩转递归的相关文章

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

玩坏JVM很简单--toString的递归调用

在JVM的内存管理机制下很少发生内存溢出的情况.至少我碰见的少,好像在SSH我多次发布项目时候出现过一次.今天看见一个特简单的方法让内存溢出(好吧,我似乎作死了--!): 1 public class InfiniteRecursion { 2 public String toString(){ 3 return "InfiniteRecursion address : " + this + "\n" ; 4 } 5 public static void main(

angularjs 高级玩法 创建递归的模板 兼容IE浏览器

说到兼容IE7 IE8浏览器,angularjs官方已经明确说明:v1.3 之后的版本(含v1.3)都将不支持 IE7 IE8了,所以如果想要兼容IE7 IE8 就必须使用 v1.3以下的版本 上一篇文章说到递归玩法,但是IE7 IE8是玩不通的,原理我简单解释一下, angularjs在加载一个模板的时候,会进行解析内容,把内容转换成Element(元素或者说节点),这里问题就来了,在IE9+ .chrome这些浏览器,会把 <script>这种标签也当作是一种Element来处理,但是在I

angularjs 高级玩法 创建递归的模板

<script id="myTemplate" type="text/ng-template"> <!-- 你要显示的内容,例如 --> <div>a:{{data.a}}</div> <div>b:{{data.b}}</div> <!-- 递归 --> <div ng-include="'myTemplate'" ng-init="data=d

玩转数据结构——链表和递归

递归 本质上,将原来的问题,转化为更小的同一问题 举例:数组求和 1 /* 2 3 Sum(arr[0...n-1]) = arr[0] + Sum(arr[1...n-1]) <-- 更小的同一问题 4 Sum(arr[1...n-1]) = arr[1] + Sum(arr[2...n-1]) <-- 更小的同一问题 5 6 ...... 7 Sum(arr[n-1...n-1]) = arr[n-1] + Sum(arr[]) <-- 更小的同一问题 8 9 */ 10 11 pu

玩转数据结构:第5章 链表和递归

链表和递归 5-1 Leetcode中和链表相关的问题 Java类的递归,包含的成员变量有该类本身. ListNode //Definition for singly-linked list. public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } } /// Leetcode 203. Remove Linked List Elements/// http

【递归】油桶问题dp

问题 : [递归]油桶问题 题目描述 楚继光扬扬得意道:“当日华山论剑,先是他用黯然销魂掌破了我的七十二路空明拳,然后我改打降龙十八掌,却不防他伸开食指和中指,竟是六脉神剑,又胜我一筹.可见天下武学彼此克制,武学之道玄之又玄!……哎,谁用炒锅敲我头?” 楚继光的老妈大声骂道:“玩个石头剪刀布都说得这般威风,炒菜没油了,快给我去装!” “这么凶干嘛?不就吹吹牛嘛.”楚继光边嘟嘟囔囔边走进储藏室,看到储藏室有N个油桶都装 满了油,这N个油桶容积各不相同(容积为整数),楚继光需要M升油(M也为整数),

B - 瑶瑶带你玩激光坦克

B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submit Status Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射. 机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏. 瑶瑶想知道射一次激光最多可以攻击到多少个敌人.

L2-011. 玩转二叉树

L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其中序遍历序列.第三行给出其前序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树反转后的层序遍历的序列.数字间以1个空格分隔