美文网首页
day 04 (a)哈诺塔函数 hanoi 形参 实参分析

day 04 (a)哈诺塔函数 hanoi 形参 实参分析

作者: LuckTime | 来源:发表于2016-06-18 09:54 被阅读76次

    //http://www.tudou.com/programs/view/e0YyEezlkSk 视频链接
    2^(n-1)
    思路:
    if(n==1)
    cout<<A<<"-->"<<C<<endl;
    else
    {
    hanoi(n-1,A,C,B); //首先,将A柱子上的n-1个盘子,通过C柱子移到B柱子。
    cout<<A<<"-->"<<C<<endl; //然后,将A柱子上第N个盘子,移到C柱子上。
    hanoi(n-1,B,A,C); //最后,将B柱子上的N-1个盘子,通过A柱子移到C柱子。
    }

    void Move(char chSour,char chDest)
    {
    /打印移动步骤/
    printf("\nMove the top plate of %c to %c",chSour,chDest);
    }
    Hanoi(int n,char chA,char chB,char chC)
    {
    /检查当前的盘子数量是否为1/
    /盘子数量为1,打印结果后,不再继续进行递归/
    if(n==1)Move(chA,chC);
    /盘子数量大于1,继续进行递归过程/
    else
    {
    Hanoi(n-1,chA,chC,chB); //将A柱子上的N-1个盘子,通过C移到B
    Move(chA,chC); //再将A柱子上的第N个盘子,通过A移到C
    Hanoi(n-1,chB,chA,chC); //最后,将B柱子上的N-1个盘子,通过A移到C
    }
    }
    main()
    {
    int n ;
    /输入盘子的数量/
    printf("\nPlease input number of the plates: ");
    scanf("%d",&n);
    printf("\nMoving %d plates from A to C:",n);

    /*调用函数计算,并打印输出结果*/
    Hanoi(n,'A','B','C');           //有n个牌子,将A柱子的盘子通过B移到C 
    

    }

    include<iostream>

    include<stdio.h>

    using namespace std;

    enum Sort{ A,B,C,D,E } ; //注意放的位置

    /*
    void show(int x) //某一个语句块的变量称为局部变量 仅在此范围语句块内有效。 eg:x为形式参数
    {
    cout<<x<<endl;
    首先定义上面
    形式参数:定义函数时函数名后括号中的变量名!
    实际参数:调用函数时函数名后括号中的表达式!

    1.形参未被调用时,不占存储单元。形参只在调用过程中占用存储单元。形参定义时必须指定类型!
    2.实参是常量。变量或者表达式!要与形参类型一致!而且实参要有确定的值,占用储存单元,在调用过程中实参将值赋给形参!
    3.C中实参对形参数据传递时时单向传递。在存储单元中是不同的单元!/
    /

    void order(char name[40],int num=1,char thank[]="谢谢!") //int 有默认值,当并不输入时,自动默认为1. 并且存在默认值的参数应靠右摆放。
    {
    cout<< name<< ":" << num << "份\t" <<thank<<endl;
    }
    /
    void order(char name[],bool sex)
    {
    cout<< name[20] <<",是个"<<(sex?"帅哥":"美女") <<endl; //三目运算符的巧妙用法
    }
    main()
    {
    /

    char name[40];
    int num;
    cin>>name>>num;
    Sort a = A; //enum
    cout << a <<endl;
    order(name,num); //形式参数 和默认参数的理解 //传参过程 1.保存现场 2.传参数 3.执行形式参数语句 4.带回结果
    cout<< "hello world" <<endl; //输出语句
    /
    /

    char name[20];
    bool sex;
    cout<<"please enter name and true /false"<<endl;
    cin>>name;
    cout<<name<<endl;
    cin>>sex;
    order(name,sex); //---------------------疑问?为何传入name 在形参中无法读取?可以用指针解决吗?,
    //order("xiao",true);
    */
    }

    c++ 哈诺塔

    include<iostream>

    using namespace std;

    void hanoi(int n,char A,char B,char C);
    main()
    {

    char ch1='A';
    char ch2='B';
    char ch3='C';

    int n;
    cout<<"please enter the number for post."<<endl;//输入柱子的数量
    cin>>n;
    hanoi(n,'A','B','C');//将Pa柱子上的n个盘子,通过Pb移到Pc;

    }

    void hanoi(int n,char A,char B,char C)
    {
    if(n==1)
    cout<<A<<"-->"<<C<<endl; //如果仅一个盘子,将A--C
    else
    {
    hanoi(n-1,A,C,B); //首先,将A柱子上的n-1个盘子,通过C柱子移到B柱子。
    cout<<A<<"-->"<<C<<endl; //然后,将A柱子上第N个盘子,移到C柱子上。
    hanoi(n-1,B,A,C); //最后,将B柱子上的N-1个盘子,通过A柱子移到C柱子。
    }
    }

    //常见递归函数

    /* 9 6 3 0

    include<iostream>

    using namespace std;
    int recursion (int n);
    main()
    {
    int n;
    cin>>n;
    recursion(n);
    }

    int recursion(int n)
    {
    if(n==1||n==2||n==0)
    cout<<n<<endl;
    else
    {
    recursion(n-3);
    cout<<n<<endl;
    }

    }
    */

    /*

    include<iostream>

    using namespace std;
    int factorial(int n);

    main()
    {
    int n;
    cout<<"please input number factorial"<<endl; //输入数的阶乘
    cin>>n;
    cout<<factorial(n)<<endl;
    }

    int factorial(int n)
    {
    if(n==1||n==0)
    return 1; //注意点
    else
    {
    //return
    return n*factorial(n-1); //注意点 此为两个 return

    //cout<<n<<endl;
    

    }
    }
    */

    /* 简单递归的理解分析

    include<iostream>

    using namespace std;
    int show(int n);
    main()
    {
    int n;
    cin>>n;
    show(n);
    }

    int show(int n)
    {
    if(n>9)
    {
    show(n/10); //如果数大于10 ,就除以10.
    cout<<" ";
    }
    cout << n%10; //if n小于10,就求与
    }

    //432 32 //先除以100
    //32 2 //再除以 10
    //2 <=9 2%10 ==2
    斐波那契数列

    include<iostream>

    using namespace std;

    int fib(int n);//斐波那契数列 1 1 2 3 5 8 f(n)=f(n-1)+ f(n-2)

    main(){
    int n;
    cin>> n;
    cout<<fib(n)<<endl;; //输出斐波那契函数

    }

    int fib(int n)
    {
    if(n == 1 || n == 2)
    {
    return 1; //思路解析:1. 将数看成两部分,即三个数。{F(n-2)、F(n-1)F(n)} 已知 Fn=F(n-1)+F(n-2) 并当f(n=1||n==2)=1时,依次递归求解
    }
    return fib(n - 2) + fib(n - 1); //两个return 语句记住即可 //fib(3) =f(1)+f(2) fib(4) =f(2)+f(3)
    }
    标示盘子的编号:

    include <iostream>

    using namespace std;

    void hanoi(int top,int n,char A,char B,char C);

    main()
    {
    hanoi(1,4,'A','B','C');//将Pa柱子上的n个盘子,通过Pb移到Pc
    }
    void hanoi(int top, int n,char A,char B,char C) //几号盘子 剩几个盘子 从哪 到哪 临时位置
    {
    if(n==1)
    cout<< top <<" :"<< A <<"-->"<< C <<endl; //如果仅一个盘子,将A--C
    else
    {
    hanoi(top , n-1 , A,C,B); //将A柱子上的n-1个盘子通过C移到B
    cout<< top +n-1 <<" :"<< A <<"-->"<< C <<endl; //将A柱子上的最后一个盘子,通过A移到C
    //hanoi(top+n-1 , 1 ,A,B,C) ; //然后,将A柱子上第N个盘子,移到C柱子上。
    hanoi(top, n-1 , B,A,C); //最后,将B柱子上的N-1个盘子,通过A柱子移到C柱子。
    }
    }

    相关文章

      网友评论

          本文标题:day 04 (a)哈诺塔函数 hanoi 形参 实参分析

          本文链接:https://www.haomeiwen.com/subject/lznvdttx.html