zoukankan      html  css  js  c++  java
  • 由易到难学习递归的精华

    以下是收集的一些递归实现的小算法,勤加练习,相信每个人都能对简单的递归驾驭自如!

    1加到n的一种递归的简洁写法

    int AddFrom1ToN_Recursive(int n)
    {
    	return n<=0 ?

    0 : n+AddFrom1ToN_Recursive(n-1); }


    2进制。8进制,16进制的递归写法,原理同样!

    void go2(int nNum)
    {
    	if (nNum == 0)
    		return;
    	else
    	{
    		go2(nNum / 2);
    		printf("%d", nNum % 2);
    	}
    }
    
    void go8(int nNum)
    {
    	if (nNum == 0)
    		return;
    	else
    	{
    		go8(nNum / 8);
    		printf("%d", nNum % 8);
    	}
    }
    
    void go16(int nNum)
    {
    	if (nNum == 0)
    		return;
    	else
    	{
    		go16(nNum / 16);
    		printf("%d", nNum % 16);
    	}
    }


    很多时候我们都可以使用一个栈来模拟递归中的数据。

    想要拿到高薪,就要有实力,怎样让别人认为你有实力,就是你写代码的能力和写代码的速度。反应速度。

    多多练习才是王道。

    比方说面试官让你求随意一个整数有多少位的for,while,go..while,goto,递归实如今10分钟以内实现。就能考察你的代码能力。

    求随意一个整数有多少位的for,while,go..while,goto,递归实现


    wei++;
    for (; num; num /= 10)
    {
    	wei++;
    }
    
    while (num)
    {
    	wei++;
    	num /= 10;
    }
    
    do 
    {
    	wei++;
    	num /= 10;
    }while (num);
    
    AAA:
    if (num)
    {
    	num /= 10;
    	wei++;
    	goto AAA;
    }


    5050-100-99-98-....-1  for,while,do...while,goto,递归实现

    int Reduce(int sum, int n)
    {
    	if (n == 0)
    		return sum;
    	else
    	{
    		return Reduce(sum-=n, n - 1);
    	}
    }


    以下是求二叉树叶子结点的个数的递归算法。注意使用全局变量和使用函数传參的方式保存叶子结点个数的异同。

    要特别掌握另外一种递归的使用方法。


     

    int sum = 0;
    int DLR_CountLeafNum(BiTNode *root)//採用中序遍历的递归算法
    { 
    	if ( root)  //非空二叉树条件,还可写成if(root !=NULL )
    	{   
    		if(!root->lchild && !root->rchild)  //是叶子结点则统计并打印
    		{   
    			sum++;     
    			printf("%c
    ",root->data);  
    		}
    		DLR_CountLeafNum(root->lchild); //递归遍历左子树,直到叶子处;
    		DLR_CountLeafNum(root->rchild);//递归遍历右子树。直到叶子处。
    }
    
    	return(0);  
    }
    
     
    int DLR_CountLeafNum2(BiTNode *root, int *psum)//採用中序遍历的递归算法
    { 
    	if ( root)  //非空二叉树条件。还可写成if(root !=NULL )
    	{   
    		if(!root->lchild && !root->rchild)  //是叶子结点则统计并打印
    		{   
    			(*psum) ++;     
    			printf("%c
    ",root->data);  
    		}
    		DLR_CountLeafNum2(root->lchild, psum); //递归遍历左子树,直到叶子处;
    		DLR_CountLeafNum2(root->rchild, psum);//递归遍历右子树,直到叶子处;
    }
    
    	return(0);  
    }

    阿里巴巴面试题 用递归推断一个数组是否是递增数组

    bool test1(int arr[], int n)
    {
    	if (n == 0)
    		return true;
    	return test1(arr, n - 1) && arr[n]>arr[n - 1];
    }
    
    bool test2(int arr[], int n)
    {
    	if (n == 1)
    		return true;
    	else if (n == 2)
    		return arr[n-1] > arr[n-2];
    	else
    		return test2(arr, n - 1) && arr[n-1] > arr[n - 2];
    }
    
    //由斐波那契数列引出的面试题,跳台阶
    //一次能够调1级,2级,3级
    int step(int nStep)
    {
    	if (1 == nStep)
    		return 1;
    	else if (2 == nStep)
    		return 2;
    	else if (3 == nStep)
    		return 4;
    	else
    		return step(nStep - 1) + step(nStep - 2) + step(nStep - 3);
    }
    
    //一次能够调1级,2级
    int taijie(int n)
    {
    	if (1 == n)
    		return 1;
    	else if (2 == n)
    		return 2;
    	else
    		return taijie(n - 1) + taijie(n - 2);
    }


  • 相关阅读:
    js-----面向对象=====>工厂模式/构造函数/原型模式
    MarkDown语法
    Vue 基础篇
    CSS 预处理语言之 less 篇
    Git常用命令
    与 JSON 相关的一些操作 (项目中用到一部分,后续逐渐完善)
    [转] -- html5手机网站自适应需要加的meta标签
    [转] -- 最全前端资源汇集
    json和jsonp的区别,ajax和jsonp的区别
    对象
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6932696.html
Copyright © 2011-2022 走看看