将递归函数转换为非递归函数 [英] Convert recursive function into the non-recursive function

查看:75
本文介绍了将递归函数转换为非递归函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以将函数 go 转换为非递归函数?一些提示或启动草图会很有帮助

Is it possible to convert the function go into the non-recursive function? Some hints or a start-up sketch would be very helpful

public static TSPSolution solve(CostMatrix _cm, TSPPoint start, TSPPoint[] points, long seed) {
    TSPSolution sol = TSPSolution.randomSolution(start, points, seed, _cm);
    double t = initialTemperature(sol, 1000);
    int frozen = 0;
    System.out.println("-- Simulated annealing started with initial temperature " + t + " --");
    return go(_cm, sol, t, frozen);
}

private static TSPSolution go(CostMatrix _cm, TSPSolution solution, double t, int frozen) {
    if (frozen >= 3) {
        return solution;
    }
    i++;

    TSPSolution bestSol = solution;
    System.out.println(i + ": " + solution.fitness() + " " + solution.time() + " "
            + solution.penalty() + " " + t);
    ArrayList<TSPSolution> nHood = solution.nHood();

    int attempts = 0;
    int accepted = 0;

    while (!(attempts == 2 * nHood.size() || accepted == nHood.size()) && attempts < 500) {
        TSPSolution sol = nHood.get(rand.nextInt(nHood.size()));
        attempts++;

        double deltaF = sol.fitness() - bestSol.fitness();
        if (deltaF < 0 || Math.exp(-deltaF / t) > Math.random()) {
            accepted++;
            bestSol = sol;
            nHood = sol.nHood();
        }
    }

    frozen = accepted == 0 ? frozen + 1 : 0;

    double newT = coolingSchedule(t);

    return go(_cm, bestSol, newT, frozen);

}

推荐答案

这个很简单,因为它是尾递归的:递归调用和;函数返回什么.因此,您可以将 go 的主体包装在循环 while (frozen<3) 中,并在循环结束后 return solution.并将递归调用替换为对参数的赋值:solution=bestSol;t=newT;.

This is an easy one, because it is tail-recursive: there is no code between the recursive call & what the function returns. Thus, you can wrap the body of go in a loop while (frozen<3), and return solution once the loop ends. And replace the recursive call with assignments to the parameters: solution=bestSol; t=newT;.

这篇关于将递归函数转换为非递归函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆