如何创建特定的数字链

时间:2016-04-25 02:24:26

标签: javascript function

我有一个学校提示创建一个函数,找出在用户输入的范围内哪个整数产生最长的链。 "链#34;包括:

  • 询问用户是否有号码。
  • 如果数字是偶数,则除以2.
  • 如果它的奇数乘以3并加1。
  • 继续此操作直至达到1.

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());

1 个答案:

答案 0 :(得分:2)

作为家庭作业,我应该轻推你,而不仅仅是给你答案。如果我给你一个单一的建议,你应该首先将你的工作分成易于理解的功能。编写一个可以完成所有事情的大功能是灾难的一个方法。你现在的功能

  • 提供两个用户输入提示
  • 基于用户输入的循环
  • 确定偶数和奇数值
  • 根据Collat​​z链程序执行基本算术

将其分解为单独的部分将使您更容易推理您的代码。我从我希望工作的顶级功能开始,然后从那里开始工作。

function FindMaxCollatzInRange(x,y) {
  // max = ...
  // ...
  return max;
}

如果您发现自己需要其他功能,那就完全正常了。根据需要写下它们。

您的基本算法应该执行以下操作:

  • 表示minmax之间的数字(含)...
  • 计算并记录每个数字的collat​​z链长度
  • 根据记录的长度,返回最长的数字
  

所以我在这里怎么做。这超出了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的Collat​​z链长最长,长度为20"

简单地说,每个函数都负责完成一个事物。回答问题的函数是maxCollatz函数,该函数使用collatzLenrange中的每个元素计算链长列表。最后,减少列表以确定哪个数字具有最长链。

以下是通用依赖项

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)));

补充阅读: