R中的递归函数

时间:2015-12-06 12:44:48

标签: r recursion

我想了解这个问题。我在for陈述后停止了解。

这是一个递归程序(打印所有可能的方式,使用澳大利亚硬币(5,10,20,50,100和200美分面额)可以弥补金额x(以美分计))。每个分解都是有序的。

change <- function(x, y.vec = c()) {
    # finds possible ways of making up amount x using Australian coins 
    # x is given in cents and we assume it is divisible by 5
    # y.vec are coins already used (so total amount is x + sum(y.vec)) 

    if (x == 0) {
        cat(y.vec, "\n")
    } else {
        coins <- c(200, 100, 50, 20, 10, 5) 
        new.x <- x - coins
        new.x <- new.x[new.x >= 0]
        for (z in new.x) {
            y.tmp <- c(y.vec, x - z)
            if (identical(y.tmp, sort(y.tmp))) {
                change(z, y.tmp)
            }
        }
    }
    return(invisible(NULL))
}

重写此程序,以便不将其输出写入屏幕,而是将其作为列表返回,其中每个元素都是一个可能分解x的向量。

1 个答案:

答案 0 :(得分:0)

由于算法每次通过循环考虑每个硬币,因此可以为同一组硬币得出多个结果(例如35 = 5 + 10 + 20 = 5 + 20 + 10 = 10 + 20 + 5是三种不同方式的相同答案)。循环内部的逻辑确保答案仅给出一次,按低值到高值硬币排序,因为if (identical(y.tmp, sort(y.tmp)))仅在遇到第一次时评估为TRUE一次。 (用change(z, c(y.vec, x - z))替换循环内部的逻辑以查看差异。)