递归——算24

来源:互联网 发布:java 垃圾回收 手动 编辑:程序博客网 时间:2024/06/10 11:55

//
// Created by
朱正天 on 2017/8/10.

//http://cxsjsxmooc.openjudge.cn/2017t1summerw4/1/

//递归为什么能不断调用自己,因为所有问题都是同一个重复性的动作、解决方案。请考虑周全。

//理解算法本质,需要先读懂题目,再熟练算法概念,最后最重要的是,清除自己创造的函数用法,一定要符合算法概念。自身概念一定要清晰。

问题分析:

//n个数算24,先用两个数算,然后和剩下的n-2个数算,总共n-1个数;这样构成递归想法

创造函数:

//count24(inta[],int n)代表用a[n]来算出24

递归概念之一:

//递归边界条件还是一个数是24就是等式


#include <iostream>
#include <cstdio>
#include <cmath>
#define EPS1e-6

doublea[5]={5,5,5,1};//a[]原始输入数据,修改着玩
boolisZero(doublex);
using namespacestd;
boolcount24(doublea[],intn){//另开数组b[]为了实践实验
   
if(n==1){//边界条件   

   if(isZero(a[0]-24))return true;
       
else returnfalse;
    }
   
doubleb[5];
   
for(inti = 0; i < n-1; ++i){
       
for(intj=i+1;j<n;++j) {//2个数出来构成

           intm = 0;
           
for(intk = 0; k <n; ++k) {
               
if(k != i && k != j)
                    b[m++] = a[k];
//把剩下的数放进b[],完成n-1个数共同算24的转移使命,这和函数用法相关count24()

}
            b[m] = a[i] +a[j];
           
if(count24(b, m + 1)) {//m

数组下标从0开始,所以调用count24()一定要m+1               returntrue;
            }
            b[m] = a[i] -a[j];
           
if(count24(b, m + 1))
               
return true;
            b[m] = a[j] -a[i];
           
if(count24(b, m + 1))
               
return true;
            b[m] = a[i] *a[j];
           
if(count24(b, m + 1))
               
return true;

if (!isZero(a[j])){
                b[m] = a[i] /a[j];
           
if (count24(b, m +1))
               
return true;
            }

if(!isZero(a[i])){
               b[m]=a[j]/a[i];
               
if(count24(b,m+1))
                   
return true;
            }

}
    }
   
return false;
}

bool isZero(doublex){
   
return fabs(x)<=EPS;
}

int main()
{
    cout
<<count24(a,4);
   
return 0;
}

//
// Created by 朱正天 on 2017/8/10.

//http://cxsjsxmooc.openjudge.cn/2017t1summerw4/1/
#include <iostream>
#include <cstdio>
#include <cmath>
#define EPS 1e-6

doublea[5]={5,5,5,1};//a[]原始输入数据,修改着玩
bool isZero(double x);
using namespace std;
bool count24(double a[],int n){//另开数组b[]为了实践实验
    if(n==1){
        if(isZero(a[0]-24)) returntrue;
        else return false;
    }
    double b[5];
    for (int i = 0; i < n-1; ++i){
        for(int j=i+1;j<n;++j){//选几个数出来
            int m = 0;
            for (int k = 0; k < n;++k) {
                if (k != i && k!= j)
                    b[m++] =a[k];//把剩下的数放进b[]

}
            b[m] = a[i] +a[j];
            if (count24(b, m + 1)){
                return true;
            }
            b[m] = a[i] -a[j];
            if (count24(b, m +1))
                return true;
            b[m] = a[j] -a[i];
            if (count24(b, m +1))
                return true;
            b[m] = a[i] *a[j];
            if (count24(b, m +1))
                return true;

if (!isZero(a[j])){
                b[m] = a[i] /a[j];
            if (count24(b, m +1))
                return true;
            }

if(!isZero(a[i])){
               b[m]=a[j]/a[i];
               if(count24(b,m+1))
                    return true;
            }

}
    }
    return false;
}

bool isZero(double x){
    return fabs(x)<=EPS;
}

int main()
{
    cout<<count24(a,4);
    return 0;
}

 

来自 <http://write.blog.csdn.net/postedit/77093573