js递归时有多个结束条件的实现方法

js递归时有多个结束条件的实现方法,第1张

// 数组中表示前一种语言对后一种语言有影响var influences = [
['Lisp', 'Smalltalk'],
['Lisp', 'Scheme'],
['Smalltalk', 'Self'],
['Scheme', 'JavaScript'],
['Scheme', 'Lua'],
['Self', 'Lua'],
['Self', 'JavaScript']];// 获得受某种语言直接影响的语言的列表function nexts(graph, node) {  if (_isEmpty(graph)) return [];  var pair = _first(graph);  var from = _first(pair);  var to   = second(pair);  var more = _rest(graph);  if (_isEqual(node, from))    return construct(to, nexts(more, node));  else
return nexts(more, node);
}
nexts(influences, 'Lisp');// 输出: ["Smalltalk", "Schema"];

后面又给了一个练习题,让nexts能够遍历多个节点。我理解这个练习题的要求是:
参数:influences, nodes (例如['Lisp', 'Self'])
输出:

{
Lisp: ["Smalltalk", "Schema"],
Self: ["Lua", "JavaScript"]

感觉这个递归有两个结束条件:

_isEmpty(graph) 表示当前节点递归完了

_isEmpty(nodes) 表示所有节点递归完了

想了半天,除了在nexts外层套一个循环外,没能写出很好的递归方法。

希望各路大神能给一个思路,如果能给出一个多条件递归时的思路总结,说明一下这种问题应如果分解,就再好不过了。

写了一个示例,里面包含了执行环境和用到的工具函数,可以在这里实验。

计算阶乘不一定要用递归, 但你提到了思路就
假设有个函数 F(x) 接受一个数, 返回它的阶乘结果
那麽通过定义可发现如下推导式
F(x) = x F(x - 1)
又F(0) = F(1) = 1
然後把以上式子转化为代码即可

你获取红色分支的时候应该是异步去后台取的数据吧。
因为js是单线程的,所以在发送请求(去获取红色后的分支)后,继续执行下边的代码。蓝色分支被加上。
所以你应该在获取完红色分支的数据之后,在success 的function中再把蓝色的显示出来。
用JQuerydeferred 可以满足你的需求。
上边是根据你的描述猜的,有问题,再追问吧。

递归经常碰到的问题了。
出问题的地方是 Run(temp,path);
既然是递归的调用 而且这个函数本身 有 return 值 那么 你应该在
调用 Run(temp,path);的时候 接收他的返回值
应该写成 value = Run(temp,path);
1 现在你可以设成 局部变量 var value 了。
之所以出现undefined就是因为
return value 这行代码 就执行了 1次 也就是 第一个执行 var test=Run(myjson,mypath);的时候
这个时候 value 变量还没有定义出来, value是在 最后一次执行 Run(temp,path);的时候才定义的,而需要把这个 返回出来 并接收 才有效。
2 json=json[path[0]],
这个地方 不会报错 你是写错了代码
你如果 把这个地方 写成 json=json[path[0]],
那么下面 Run(temp,path); 是不是也应该写成 Run(json,path);呢?
这样就不会报错。
3 在javascript里 数组和 对象 都是属于 引用类型的, 这是为了 节省内存空间。
其实道理简单, var a = {b:1} 这个时候 a变量里面 存储的是 保存这个 对象的内存地址,
打个比方 这个对象是一个宝箱 他是隐藏在内存的, a变量里面是打开这个宝箱的钥匙和地图
那么 b=a的时候 只是 复制了 钥匙和地图, 宝箱还是一个, 所以这个时候 a 和b 是指同一个对象的。
最后代码 修改后是这样
function Run(json,path){
if(pathlength<=1){
var value=json[path[0]]; // 如果这里换成var value=json[path[0]]结果是undefined
} else {
var temp;
json=json[path[0]]; //这里为什么不能用 json=json[path[0]]
pathsplice(0,1);
value = Run(json,path);
//argumentscallee(temp,path);
}
return value;
}
var myjson={a:1,b:{c:{e:3},d:4}};
var mypath=['b','c','e'];
var test=Run(myjson,mypath);
alert(test);

你好,我给你写了一个函数:

function nodeTree(node) {
    var root = nodetagName,
        tree = '<span style="color:#fff;">' + root + '</span><br>',
        output = '',
        kcolors = ['#cc99cc', '#78dead', '#3ba264', '#ffcc54'],
        vcolors = ['#bb512d', '#6798e8', '#f3825b', '#c1cff4'];
    function listObj(obj, _root) {
        var first = true,
            root = _root;
        for (var k in obj) {
            if (first) {
                root += '::' + k;
                first = false;
            }
            var deep = rootsplit('::')length - 1,
                v = typeof(obj[k]) == 'function' || typeof(obj[k]) == 'string' || ('' + obj[k])indexOf('function') === 0  typeof(obj[k]) : obj[k];
            tree += '<span class="gray">&nbsp;&nbsp;&nbsp;' + '|'repeat(deep - 1) + '| </span><span style="color:' + kcolors[deep - 1] + ';">' + k + '</span>: <span style="color:' + vcolors[deep - 1] + ';">' + v + '</span><br>';
            if ((ObjectprototypetoStringcall(obj[k]) === '[object Object]' || ObjectprototypetoStringcall(obj[k])match(/^\[object\sHTML[^I]/)) && deep < 3) {
                listObj(obj[k], root);
            }
        }
        return tree;
    }
    tree = listObj(node);
    documentbodystylebackgroundColor = '#2d2d2d';
    documentbodystylecolor = '#fff';
    documentbodyinnerHTML = tree;
}

使用方法很简单,打开任意页面,在控制台先执行上面的函数声明,然后调用函数显示指定节点的属性列表:

nodeTree(documentbody); // or
nodeTree(documentgetElementsByTagName('div')[0]);

返回结果直接就会覆盖body中的内容,并高亮缩进显示,查看非常方便

递归显示内容比较多,执行会略慢,现在控制在显示三级,调用时需略作等待

希望是你想要的结果,望采纳~~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12978185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存