首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快乐号离题解不起作用

快乐号离题解不起作用
EN

Stack Overflow用户
提问于 2020-11-27 21:38:46
回答 2查看 1.2K关注 0票数 1

试图找出这个编码问题:

编写一个算法来确定一个数字n是否“高兴”。

快乐数是由以下过程定义的一个数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1为止(它将停留在其中),或者它在一个不包括1的循环中无休止地循环。这个过程以1结尾的数字是快乐数。

如果n是一个快乐的数字,则返回True,如果不是,则返回False。

我做了一些工作,但我不知道我做错了什么。会很感激你的指点。谢谢!

代码语言:javascript
运行
复制
function isHappy(numba1){
    let sum = 0;
    numba = numba1.toString().split('')
    let numbaArr = numba.map(y => parseInt(y))
    for (var x = 0; x< numbaArr.length; x++){
            sum += numbaArr[x] ** 2
    }
    if (sum > 1){
        isHappy(sum)
    }
    else if (sum === 1){
        return true
    }
    else if (sum <= 0){
        return false
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2020-11-30 15:24:38

你的回答有两个问题,一个小的,一个大的。

  • Small:不返回递归调用的值。这是:

若(sum > 1){ isHappy(sum) }

应该是

如果(sum > 1){返回isHappy(sum) }

  • Large:您并不是在检查我们是否循环过相同的值这一基本工作。例如,在测试15时,我们得到以下值

15、26、40、16、37、58、89、145、42、20、4、16 ^

我们可以退出,因为我们见过16两次。15不高兴。但是对于44我们得到

44、32、13、10、1

我们在没有骑车的情况下撞上1,所以44是一个快乐的数字。

您的代码需要跟踪它到目前为止所看到的值。

下面是一种递归方法:

代码语言:javascript
运行
复制
const digitsSquareSum = (n) => 
  String (n) .split ('') .map (n => n * n) .reduce ((a, b) => a + b, 0)

const _isHappy = (n, seen) =>
  n == 1
    ? true
  : seen .has (n) 
    ? false
  : _isHappy (digitsSquareSum (n), seen .add (n))

const isHappy = (n) => 
  _isHappy(n, new Set())

// display the happy numbers among the first 100 positive integers
console .log (Array .from ({length: 100}, (_, i) => i + 1) .filter (isHappy) .join(', '))

我们使用一个辅助函数来计算数字的平方和。这只会使主要功能变得更干净。主要功能,_isHappy是一个内部的、私有的函数,不向用户公开。它是递归的,并维护我们已经看到的值的Set。如果我们的号码是1,我们返回true。如果我们的数字在我们已经看到的一组值中,我们返回false。否则,我们将它添加到已经看到的集合中,通过调用我们的助手来计算下一个测试用例,并使用这些调用_isHappy

我们的公共函数只是调用这个主函数,创建初始的空Set值,并将其与要测试的数字一起传递。

在我们的演示中,我们使用Array .from ({length: 100}, (_, i) => i + 1),这是从1100创建整数数组的几种紧凑方法之一。实际上,我会将其抽象为一个range函数,它接受lohi值,并在它们之间创建一个整数数组,但这超出了这个答案的范围。

我们不必使用包含两个参数的内部递归函数和带有一个参数的公共函数的分解。我们可以使用这样的默认参数:

代码语言:javascript
运行
复制
const isHappy = (n, seen = new Set()) =>
  console .log({n, seen}) ||
  n == 1
    ? true
  : seen .has (n) 
    ? false
  : isHappy (digitsSquareSum (n), seen .add (n))

但这也存在一些潜在的问题。例如,我们不能像以前那样叫它:

代码语言:javascript
运行
复制
range(1, 100) .filter (isHappy)

因为filter为其回调提供了其他参数。它不仅提供了值,还提供了索引和整个数组。然而,isHappy认为第二个参数是已见值的Set;当它通过索引时,事情就会失败。我们可以这样做:

代码语言:javascript
运行
复制
range(1, 100) .filter ((n) => isHappy (n))

但是当我们这样写的时候,我们总是要采取这样的谨慎态度。我已经养成了这样做的习惯,只有在内部功能中,我才能控制它的名称。偶尔也会咬我一口。

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65044103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档