函数算法题1
寻找喇叭花数
- 题目:喇叭花数是这样的三位数:其每一位数字的阶乘之和恰好等于它本身。即abc = a! + b!+ c!,其中abc表示一 个三位数。试寻找所有喇叭花数。
- 思路:将计算某个数字的阶乘封装成函数,这样可以让问题简化。
- 结果为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 计算一个数字的阶乘,0的阶乘为1
function factorial(n) {
// 累乘器
var result = 1;
for (var i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 穷举法,从100到999寻找喇叭花数
for (var i = 100; i <= 999; i++) {
// 把数字i变为字符串
var i_str = i.toString();
// abc分别表示百位、十位、个位
var a = Number(i_str[0]);
var b = Number(i_str[1]);
var c = Number(i_str[2]);
// 根据喇叭花数的条件,来判断
if (factorial(a) + factorial(b) + factorial(c) == i) {
console.log(i);
}
}
</script>
</body>
</html>
函数算法题2
JavaScript内置sort()方法
- 数组排序可以使用sort()方法,这个方法的参数又是一个函数。
- 这个函数中的a、b分别表示数组中靠前和靠后的项,如果需要将它们交换位置,则返回任意正数;否则就返回负数。
递归
- 函数的内部语句可以调用这个函数自身,从而发起对函数的一次迭代。在新的迭代中,又会执行调用函数自身的语句,从而又产生一次迭代。当函数执行到某一次时,不再进行新的迭代,函数被一层一层返回,函数被递归。
- 递归是一种较为高级的编程技巧,它把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归的要素
- 边界条件:确定递归到何时终止,也称为递归出口。
递归模式:大问题是如何分解为小问题的,也称为递归体。
递归常见算法题
斐波那契数列
- 斐波那契数列是这样的数列:1、1、2、3、5、8、13、21,你找到规律了么?
- 数列下标为0和1的项的值都是1,从下标为2的项开始,每项等于前面两项的和。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 斐波那契数列
// 编写一个函数,这个函数的功能是返回斐波那契数列中下标为n的那项的值
function fib(n) {
// 数列的下标为0的项,和下标为1的项值是1
if (n == 0 || n == 1) return 1;
// 斐波那契数列的本质特征就是每一项,都等于前面两项的和
return fib(n - 1) + fib(n - 2);
}
// 定义保存斐波那契数列的数组
var result = [];
// 书写一个循环语句,计算斐波那契数列的前15项
for (var i = 0; i <= 15; i++) {
// 将每一项的斐波那契数都推入到结果数组中
result.push(fib(i));
}
// 输出保存斐波那契数列的数组
console.log(result);
</script>
</body>
</html>
实现深克隆
- 使用递归思想,整体思路和浅克隆类似,但稍微进行一些改动:如果遍历到项是基本类型值,则直接推入结果数组;如果遍历到的项是又是数组,则重复执行浅克隆的操作。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 原数组
var arr1 = [33, 44, 11, 22, [77, 88, [33, 44]]];
// 函数,这个函数会被递归
function deepClone(arr) {
// 结果数组,“每一层”都有一个结果数组
var result = [];
// 遍历数组的每一项
for (var i = 0; i < arr.length; i++) {
// 类型判断,如果遍历到的项是数组
if (Array.isArray(arr[i])) {
// 递归
result.push(deepClone(arr[i]));
} else {
// 如果遍历到的项不是数组,是基本类型值,就直接推入到结果数组中,
// 相当于是递归的出口
result.push(arr[i]);
}
}
// 返回结果数组
return result;
}
// 测试一下
var arr2 = deepClone(arr1);
console.log(arr2);
// 是否藕断丝连
console.log(arr1[4][2] == arr2[4][2]);
arr1[4][2].push(99);
console.log(arr1[4][2]);
console.log(arr2[4][2]);
</script>
</body>
</html>