c语言学习笔记

来源:互联网 发布:网页传奇游戏源码 编辑:程序博客网 时间:2024/06/06 01:41

递归练习

一、汉诺塔

假设所有的盘子都在A柱,需要移动到C柱。
输入盘子的数量,输出移动的步骤。

#include<iostream>using namespace std;void hanoi(int n, char a, char b, char c){    if(n != 1)    {        hanoi(n - 1, a, c, b);        cout<<"把一个盘子从"<<a<<"移到"<<c<<endl;        hanoi(n - 1, b, a, c);    }    else if(n == 1)    {        cout<<"把一个盘子从"<<a<<"移到"<<c<<endl;    }}int main() {    int n;    char a = 'a', b = 'b', c = 'c';    cin>>n;    hanoi(n, a, b, c);     return 0;    }

二、放苹果

把m个苹果放到n个盘子里,可以有空盘子。求有多少种算法?

例:

输入:7 3
输出:8

注:

不考虑盘子顺序,即1,5,15,1,1视作同一种放法

int apple(int m, int n){    int x, emptyExist = 0;    if( m == 1 && n == 1)        return 1;    else if(n > m)    {        return apple(m, m);    }    else if(m != 0 && n == 0)    return 0;    else if(m == 0)    return 1;    else if( n <= m)    {        return apple(m - n, n) + apple(m, n - 1);    }}           //在main函数里输入m和n后,输出apple(m, n)即可

三、求解理解错误的逆波兰表达式的值

float input[] = {'/', '+', '/', 11, 22, 24, 20};

如上input的计算方式为 :

20/(24+(22/11))

#include<stdio.h>#include<math.h>float compute(float before[], int sizebefore, float after[], int sizeafter);float reverse(float a[], int l);float input[] = {'/', '+', '/', 11, 22, 24, 20};float output[] = {'+', 11, 12};float reverse(float a[], int l){    int i;    float b[l - 2];    if(l == 3)    {        switch((int)a[0])           //a[2] 运算符 a[1]        {            case '+':                return a[2] * 1.0 + a[1];                break;            case '-':                return a[2] * 1.0 - a[1];                break;            case '*':                return a[2] * 1.0 * a[1];                break;            case '/':                return a[2] * 1.0 / a[1];                break;        }    }    else    {        for(i = 1; i <= l - 2; i++)        {            b[i - 1] = a[i];        //b[] 为 a[] 除去头和尾,即下一次递归的a[]        }        return compute(a, l, b, l - 2);     //a[l - 2] * reverse(b[])    }}float compute(float before[], int sizebefore, float after[], int sizeafter){    switch((int)before[0])    {        case '+':            return before[sizebefore - 1] * 1.0 + reverse(after, sizeafter);            break;        case '-':            return before[sizebefore - 1] * 1.0 - reverse(after, sizeafter);            break;        case '*':            return before[sizebefore - 1] * 1.0 * reverse(after, sizeafter);            break;        case '/':            return before[sizebefore - 1] * 1.0 / reverse(after, sizeafter);            break;    }}int main(){    float toBeSolved[];    int sizeOf;                 //自行输入逆波兰表达式,To be continued    printf("%f", reverse(input, sizeof(input) / sizeof(input[0])));    return 0;}
0 0
原创粉丝点击