递归原理与构造技巧(趣味算式)

这里写图片描述

代码如下:

package sf_04;
public class Main {
    /*
     * a表示参加运算的元素
     * b表示考虑的元素的下标
     * so代表结果串
     * goal代表计算目标
     */
    static void f(int a[],int k,String so,int goal){
        /*
         * 一共有三种选择:
         */
        if(k==0){//到达了第一个数字
            if(goal==a[k]){
                System.out.println(a[k]+so);
            }
            return;
        }
        /*
         * 每次将新串加在合成结果的前面。
         */
        f(a,k-1,"+"+a[k]+so,goal-a[k]);//目标要减去a[k];
        f(a,k-1,"-"+a[k]+so,goal+a[k]);
        int old=a[k-1];
        /*
         * 将两个数字进行合成。
         */
        a[k-1]=Integer.parseInt(""+a[k-1]+a[k]);
        f(a,k-1,so,goal);
        a[k-1]=old; 
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * 递归的难点在于怎么设计递归方法的参数。
         * 比如对于9来说,9的前面为+,-,或者和8合并。
         */
        int a[]={1,2,3,4,5,6,7,8,9};
        /*
         * a为当前运算的数字
         * 8代表数组下标,下标从0开始。
         * 如果从1开始时不太方便。
         * 空串为累积好的算式。
         * 110为计算的目标。
         */
        f(a,8,"",110);
    }
}

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值