代码改变世界

递归思想

2017-12-23 00:14  ywj蓝色夏天  阅读(150)  评论(0编辑  收藏  举报

观察递归,我们会发现,递归的数学模型其实就是归纳法;

递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。

如果运用列表来形容归纳法就是:

  • 步进表达式:问题蜕变成子问题的表达式
  • 结束条件:什么时候可以不再是用步进表达式
  • 直接求解表达式:在结束条件下能够直接计算返回值的表达式
  • 逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了。

返回一个二叉树的深度:

int depth(Tree t){

      if(!t) return 0;

    else {

        int a=depth(t.right);

        int b=depth(t.left);

        return (a>b)?(a+1):(b+1);

    }

}

 

判断一个二叉树是否平衡:

int isB(Tree t){

      if(!t) return 0;

    int left=isB(t.left);

    int right=isB(t.right);

    if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1)

        return (left < right)? (right +1) : (left + 1);

    else return -1;

}

全排列

#include <stdio.h>

int n = 0;

void swap(int *a, int *b)
{
    int m;
    m = *a;
    *a = *b;
    *b = m;
}
void perm(int list[], int k, int m)
{
    int i;
    if(k > m)
    {
        for(i = 0; i <= m; i++)
            printf("%d ", list[i]);
        printf("\n");
        n++;
    }
    else
    {
        for(i = k; i <= m; i++)
        {
            swap(&list[k], &list[i]);
            perm(list, k + 1, m);
            swap(&list[k], &list[i]);
        }
    }
}
int main()
{
    int list[] = {1, 2, 3, 4, 5};
    perm(list, 0, 4);
    printf("total:%d\n", n);
    return 0;
}