想象一下,你有整数分成数组,如100 - > [1,0,0]
如何编写增强长整数的递归函数。例如incr([9,9]) - > [1,0,0]?
我知道如何非递归地执行此操作。
答案 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函数,它甚至是尾部调用优化的递归函数。
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;
请注意,为了便于阅读,我使用了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
的引用。