我有一个学校提示创建一个函数,找出在用户输入的范围内哪个整数产生最长的链。 "链#34;包括:
E.g。如果以3开头,则序列为3-10-5-16-8-4-2-1。该函数将打印出产生最长链的数字和该链中的实际整数(链的长度)。
这是我到目前为止所拥有的。我无法弄明白。
function chain2()
var startNumber = prompt("Enter starting number of range", "4");
var endNumber = prompt ("Enter ending number of range", "9")
var separator="-";
while (currentNumber>1){
if (currentNumber%2==1){
currentNumber=currentNumber*3+1;
chain+=separator+currentNumber;
}
else if (currentNumber%2==0){
currentNumber=currentNumber/2;
chain+=separator+currentNumber;
}
}
return chain;
}
document.write(chain());
答案 0 :(得分:2)
作为家庭作业,我应该轻推你,而不仅仅是给你答案。如果我给你一个单一的建议,你应该首先将你的工作分成易于理解的功能。编写一个可以完成所有事情的大功能是灾难的一个方法。你现在的功能
将其分解为单独的部分将使您更容易推理您的代码。我从我希望工作的顶级功能开始,然后从那里开始工作。
function FindMaxCollatzInRange(x,y) {
// max = ...
// ...
return max;
}
如果您发现自己需要其他功能,那就完全正常了。根据需要写下它们。
您的基本算法应该执行以下操作:
min
和max
之间的数字(含)... 所以我在这里怎么做。这超出了JavaScript家庭作业的范围,但我觉得工作很有趣。
我可以发布此代码,因为我知道它无法直接复制/粘贴作为您的作业的答案。我希望这里有一些东西可以鼓励你去探索一些使用的技术。
// compute the collatz chain for a given number, x
const collatz = Y (f=> y=> x=> {
if (x === 1) return append (x) (y);
if (isEven(x)) return f (append (x) (y)) (x/2);
else return f (append (x) (y)) (x*3 + 1);
}) ([]);
// compute the length of a collatz chain
const collatzLen = comp (len) (collatz);
// create a range from minimum, n, to maximum, m
const range = Y (f=> r=> n=> m=> {
if (n > m) return r;
else return f (append (n) (r)) (n+1) (m);
}) ([]);
// compute the maximum collatz chain length for a given range
const maxCollatz = (n,m) =>
comp (foldl (([x,xlen])=> ([y,ylen])=> ylen > xlen ? [y,ylen] : [x,xlen]) ([0,1]))
(map (n=> [n,collatzLen (n)]))
(range (n) (m));
这里有一些功能的示例输出,以便您可以看到正在进行的操作
collatz (3)
//=> [ 3, 10, 5, 16, 8, 4, 2, 1 ]
collatzLen (3)
//=> 8
range (3) (10)
//=> [ 3, 4, 5, 6, 7, 8, 9, 10 ]
maxCollatz (3,10)
//=> [ 9, 20 ]
读取最后一个输出[ 9, 20 ]
的方法是,#34;数字9的Collatz链长最长,长度为20"
简单地说,每个函数都负责完成一个事物。回答问题的函数是maxCollatz
函数,该函数使用collatzLen
为range
中的每个元素计算链长列表。最后,减少列表以确定哪个数字具有最长链。
以下是通用依赖项
const comp = f=> g=> x=> f (g (x));
const mod = x=> y=> y % x;
const eq = x=> y=> y === x;
const isEven = comp (eq (0)) (mod (2));
const prop = x=> y=> y [x];
const len = prop ('length');
const concat = x=> xs=> xs .concat (x);
const append = x=> concat ([x]);
const foldl = f=> y=> xs=> xs .reduce ((x,y)=> f (x) (y), y);
const map = f=> xs=> xs .map (x=> f(x));
// U-combinator
const U = f=> f (f);
// Y-combinator
const Y = U (h=> f=> f (x=> h (h) (f) (x)));
补充阅读: