在数组递归中递增整数分割

时间:2016-11-03 08:46:23

标签: algorithm recursion integer

想象一下,你有整数分成数组,如100 - > [1,0,0]

如何编写增强长整数的递归函数。例如incr([9,9]) - > [1,0,0]?

我知道如何非递归地执行此操作。

3 个答案:

答案 0 :(得分:1)

这是Python中@ Mbo算法的示例实现:

def addOne(a, ind, carry):
    if ind<0:
        if carry > 0:
            a.insert(0, carry)
    else:
        n = a[ind] + carry
        a[ind] = n%10
        carry = n/10
        addOne(a, ind-1, carry)


n = int(raw_input("Enter a number: "))
a = []
if n == 0:
    a.append(0)

while n>0:
    a.append(n%10)
    n = n/10

a = list(reversed(a))
print "Array", a

# performing addition operation
addOne(a,len(a)-1,1)
print "New Array", a

注意:我最初发送1作为carry,因为我们要在数字上加1。

示例输入/输出

Enter a number:  99
Array [9, 9]
New Array [1, 0, 0]

答案 1 :(得分:0)

伪代码

function Increment(A[], Index)
   if Index < 0
       A = Concatenation(1, A)
   else
        if (A[Index] < 9)
            A[Index] = A[Index] + 1
        else
           A[Index] = 0
           Increment(A, Index - 1)

呼叫

  Increment(A, A.Length - 1)

答案 2 :(得分:0)

您可以使用以下JS函数,它甚至是尾部调用优化的递归函数。

&#13;
&#13;
var arr = [7,8,9],
    brr = [9,9,9];

function increment(a,r = []){
  return a.length ? (a[a.length-1] + 1) % 10 ? (a[a.length-1]++,a.concat(r))
                                             : increment(a.slice(0,a.length-1),r.concat(0))
                  : [1].concat(r);
}
console.log(increment(arr))
console.log(increment(brr))
&#13;
&#13;
&#13;

请注意,为了便于阅读,我使用了increment(a.slice(0,a.length-1),r.concat(0)),但最好是像increment(a.slice(0,a.length-1),(r.push(0),r))这样的工作,这会提高递增10K 9项数组的速度,即{{1从~1800毫秒到约650毫秒。另外,[9,9,...9]代替[1].concat(r),您可以选择使用(r.unshift(1),r),这会对FF产生轻微的性能提升(数字低于600毫秒),但在Chrome中可能不是这样,但更多的是你不会创建一个新阵列但是传递对r的引用。