zoukankan      html  css  js  c++  java
  • 递归

    递归算法简单的讲就是:一个函数调用其本身。
    他是通过重复将问题分解为同类的子问题而解决问题的方法。
    递归与普通的调用没有本质的差别,都是一个函数调用一个函数,只不过这个函数是他本身。函数调用都是通过栈来实现的。每一个应用程序运行时都有一定的内存属于他。栈是专门用来函数调用的,就是你这个函数调用了,栈就会向上伸展一层。伸展这一层存放的就是这次函数调用的形参,局部变量以及返回地址。当函数调用结束时,栈顶上还会存放这次函数调用的返回值。
    那么程序设计中,递归到底有什么用呢。那么用法就太多了,我们主要分为三类:
    ①.替代多重循环。
    ②.问题本来就是以递归形式定义的问题。
    ③.能重复将问题分解为同类的子问题而解决的问题。
    ………………


    递归的两个必要条件
    1、存在限制条件,当满足这个条件时,递归便不再继续。这个条件可以是多个。
    2、每次递归调用之后越来越接近这个限制条件。


    1.汉诺塔问题
    问题描述:古代有个樊塔,塔内有三座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移动到C座,单每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。
    基本思路就是:先将N-1个盘子放到B座,然后把剩下的最大的盘子移动到C座,然后把B座上的N-1个盘子移动到C座。

    #include <iostream>
    using namespace std;
    void Hanoi(int n,char src,char mid,char dest)
    {
    	if(n == 1){  //只有一个盘子 ,只需移动一次 
    		cout << src << "->" << dest << endl;
    		return;
    	} 
    	Hanoi(n-1,src,dest,mid);  //先将n-1个盘子从scr移动到mid
    	cout << src << "->" << dest << endl;  //再将一个盘子从src移动到dest 
    	Hanoi(n-1,mid,src,dest);  //最后把n-1的盘子从mid移动到dest
    	return; 
     } 
     
    int main()
    {
    	int n;
    	cin >> n;  //输入盘子数目 
    	Hanoi(n,'A','B','C'); 
    	return 0;
    }
    

    运行结果:

    4
    A->B
    A->C
    B->C
    A->B
    C->A
    C->B
    A->B
    A->C
    B->C
    B->A
    C->A
    B->C
    A->B
    A->C
    B->C
    

    因为如果有64个盘子,输出结果庞大,所以这里带入的是四个盘子。

    2.求n!的递归函数

    #include <stdio.h>
    
    int Factorial(int n)
    {
    	if(n == 0)
    		return 1;
    	else
    		return n * Factorial(n - 1);
     } 
     
    int main()
    {
    	int a = Factorial(5);
    	printf("%d",a);
    	return 0;
    }
    

    运行结果:

    120
    
  • 相关阅读:
    AJAX实例演示加载xml
    入门AJAX总结
    My97 DatePicker一款好用的日历控件
    SQL Server 安装错误 错误代码:0x800F0906的解决方案
    JS实现动态添加和删除DIV
    .Net之路(九).ashx来实现ajax用户名的验证
    善良公社项目总结之如何从前台向后台传输数据
    MySQL数据分析(16)— 数据操作之增删改查
    字典-Python基础前传(9)
    MYSQL之事务
  • 原文地址:https://www.cnblogs.com/zj666666/p/12342536.html
Copyright © 2011-2022 走看看