Typescript 为什么我的算法不使用线性内存空间?

Typescript 为什么我的算法不使用线性内存空间?,typescript,algorithm,recursion,functional-programming,Typescript,Algorithm,Recursion,Functional Programming,我现在写这个滚动等式检查算法只是为了好玩,主要目标是以声明的方式和函数式的方式来做。不知何故,我的算法使用了非线性内存空间。事实上,由于RangeError,它无法运行:超出了最大调用堆栈大小。很高兴得到您的帮助: const roll = (a: number): ((b: number) => number[]) => (b: number): number[] => { let a1 = a * Math.floor(Math.random() * 6 + 1);

我现在写这个滚动等式检查算法只是为了好玩,主要目标是以声明的方式和函数式的方式来做。不知何故,我的算法使用了非线性内存空间。事实上,由于RangeError,它无法运行:超出了最大调用堆栈大小。很高兴得到您的帮助:

const roll = (a: number): ((b: number) => number[]) => (b: number):  number[] => {
  let a1 = a * Math.floor(Math.random() * 6 + 1);
  let b1 = b * Math.floor(Math.random() * 6 + 1);
  return [a1, b1]
};

const compare = () => {
  let counter: number = 0;
  let totalcounter: number = 10000;
  const compareStep = (a: number[]) => {
    (() => (a[0] === 1 || a[1] === 1) && counter++)();
    totalcounter -= 1;
    (totalcounter === 0) ? console.log(counter / 10000) : compareStep(roll(1)(1));
  };
  return compareStep(roll(1)(1))
}

let Compare = compare();

Compare


当函数递归调用自身时,它需要提供更接近基本情况的参数。但是在每次对
compareStep()
的递归调用中,您都会生成一组新的卷,我的
totalCounter
减量不是很有帮助吗?您允许10K次递归,这可能太多了。您想知道需要多少次尝试才能获得相同的卷吗?啊,当您获得匹配时,您不会停止。你在计算在10公里重复赛中有多少场比赛。除非语言具有尾部递归优化,否则不能使用递归作为迭代的一般替代。