我正在用Javascript中的链表做一个练习。作为解决方案的一部分,我有一个函数,它获取一个一位数整数的链表,并将其转换为一个数字。返回的值与返回前一行记录到控制台的值不同。
例如,如果我输入(2 -> 4 -> 3)
,我的console.log就是342
,这是应该的,但在otherFunction
中返回的值是386
。输入(5 -> 6 -> 4)
记录465
,但返回535
。
num
的值是如何变化的?
function parseListNumber(list, num = 0, multiplier = 1) {
digitValue = list.val * multiplier;
multiplier *= 10;
num += digitValue;
if (list.next) {
return num + parseListNumber(list.next, num, multiplier);
} else {
console.log(num) // num is correct here
return num;
}
}
function otherFunction(list) {
parseListNumber(list); // returned value is now somehow larger
};
每次输入if
语句时,都会将num
添加到递归调用中。如果您删除了它,那么当您达到基本情况时,您的值将通过以前的递归调用返回并保持不变。
参见以下示例:
const list = {
val: 2,
next: {
val: 4,
next: {
val: 3
}
}
};
function parseListNumber(list, num = 0, multiplier = 1) {
let digitValue = list.val * multiplier;
multiplier *= 10;
num += digitValue;
if (list.next) {
return parseListNumber(list.next, num, multiplier); // remove `num +` (use tail recursion)
} else {
console.log(num) // num is correct here
return num;
}
}
function otherFunction(list) {
console.log("Actual res: ", parseListNumber(list));
};
otherFunction(list);