将数字的基数更改为给定数字

时间:2015-11-02 22:05:24

标签: python

我必须编写一个递归函数,它在10个基数中得到一个数字(n)并将其转换为给定的数字基数(k)并返回一个列表,其中的组件是最终的数字位数,例如{{1} }必须结果f(5, 3)基数3中的5为12,或[1, 2]必须为f(22, 3)

这是我尝试过的代码:

[2, 1, 1]

实际上我对它有很多想法,但由于我不太擅长编写代码,所以我无法继续下去。感谢您对我的代码的帮助和修改。

3 个答案:

答案 0 :(得分:7)

如果您考虑递归,基本情况是答案为b = cb(a,k) + b的{​​{1}},并且n < k的最后一位数是n因此,隐瞒案件为n

代码如下所示:

n%k

答案 1 :(得分:2)

你非常接近,你唯一需要做的就是改变:

    else:
        cb(a, k)

为:

    else:
        b.extend(cb(a, k))

但是,您的输出将是:

>>> cb(22, 3)
[1, 1, 2]

这与你想要的相反,因为基数3中的22是211。您可以通过撤消列表[1,1,2][::-1] == [2,1,1]或将所有来电替换为append以及将新呼叫更改为extend来解决此问题,而是在列表的开头添加:{{1} }或b.insert(0,element)

答案 2 :(得分:1)

最大的问题是你没有对递归调用的结果做任何事情,所以他们永远不会进入你的列表。我认为你也太复杂了。这样的事情应该有效:

var datas = getmyJson('/GetServices/JsonDataSvc');
var parser = function (datas) {
            var stats = {};
            for (var d in datas) {
                stats[datas[d].date] = datas[d].value;
            }
            //console.log("Data after parse", stats);
            return stats;
        };

我想如果你不做最后一部分,那么你总是得到前面的0?您还可以通过测试来进一步简化它,看它是否小于基数,从而提供更简单的解决方案

 var cal = new CalHeatMap();
        cal.init({
            itemSelector: "#cal-heatmap",
            domain: "year",
            subDomain: "month",      
            data: datas,
            afterLoadData: parser,
            start: new Date(2015, 1, 1),
            cellSize: 15,           
            },
            legend: [10, 20, 30, 40],
            legendColors: ["#ecf5e2", "#232181"]
        });