算法递归简论

【0】README

0.1) 本文总结于 数据结构与算法分析,旨在了解设计 递归程序 的相关法则和技巧;
0.2) 我记忆尤新的一点是: 凡事可以用循环代替的递归函数,它就不是一个好的递归函数,对我帮助很大;(设计完递归函数后,可以检验下,该递归函数是否可以用循环代替)


【1】 递归简论

1.1)当编写递归例程的时候,关键是要牢记递归的四条基本法则-Principle:

  • P1)基准情形:必须总是有某些基准情形,它无需递归就能解除;
  • P2)不断推进:对于那些需要递归求解的情形,每一次递归调用都必须要是求解状况朝接近基准情形的方向前进;
  • P3)设计法则:假设所有的递归调用都能运行;
  • P4)合成效益法则(compound interest rule):在求解一个问题的同一实例时, 切勿在不同的递归调用中作重复性工作 ;

【2】看三个荔枝:

#include<stdio.h>

/* 满足F(0)=0 且 F(X)=2F(X-1)+X^2 */

int F(int);

int main()
{    
    for(int i = 0; i <= 10; i++)
        printf("F(%d) = %-4d\n",i,F(i));         
}

int F(int x)
{
    if(x == 0)
        return 0;
    else 
        return 2 * F(x - 1) + x * x;
}

这里写图片描述
这里写图片描述

  • 2.2)荔枝2(一个错误的递归函数)
    source code at a glance :

这里写图片描述

  • 2.3)荔枝3

(代码参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/chapter1/p8.c
source code at a glance :

#include<stdio.h>

/*打印整数的递归例程, 如1234 打印为 1 2 3 4*/
void printout(unsigned int N);

main()
{    
    int temp = 1234554;
    printf("%d 可分解为 ",temp);    
    printout(temp);
    printf("\n");
}

void printout(unsigned int N)
{
    if(N >= 10)
        printout(N / 10);
    printf(" %d",N % 10);
}

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值