V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
alanhe421
V2EX  ›  问与答

请教个递归算法问题,递归检查目标文件夹中是不是有命中目标后缀的文件,最多尝试 N 次

  •  
  •   alanhe421 · 2022-03-27 22:15:12 +08:00 · 1085 次点击
    这是一个创建于 970 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ```js
    matchFn: (count, canRetryLimit, filePath, suffixes) => {
    if (utils.isDirectory(filePath)) {
    const files = fs.readdirSync(filePath);
    for (const file of files) {
    const found = utils.matchFn(count, canRetryLimit, `${filePath}/${file}`, suffixes);
    if (found) {
    return true;
    }
    }
    } else {
    count -= 1;
    if (filePath.match(new RegExp(`(${suffixes.join('|')})$`))) {
    return true;
    }
    }
    return false;
    }
    ```




    我想实现的是递归检查目标文件夹中是不是有命中目标后缀的文件,最多尝试 N 次。


    如上是基本实现,但是明显有错,else logic 下 count 没有正确消费上,请问如何改进下呢。
    5 条回复    2022-03-28 09:57:47 +08:00
    disk
        1
    disk  
       2022-03-27 23:31:35 +08:00
    不太熟 js ,看上去 count 是个局部变量。如果你要每个文件夹内最多尝试 n 次,直接在循环里计数跳出就行了。
    misdake
        2
    misdake  
       2022-03-28 00:10:46 +08:00
    调用下一层 count 的时候,因为 count 类型是 number ,是基本类型,所以内层拿到的是一个复制。内外层的 count 不是同一个,内层减了,外层并不会变。
    改动的话,可以尝试包一层,把外层变成非基本类型,比如 number[1],{inner: number}这种。这样调用 count[0]或者 count.inner 的时候内外层的 number 就是指向同一个数据了。
    threebr
        3
    threebr  
       2022-03-28 04:50:50 +08:00
    @misdake 不了解 js ,但这点跟 python 好像
    ETiV
        4
    ETiV  
       2022-03-28 05:57:10 +08:00 via iPhone
    你是想过程正义还是结果正义…

    结果正义的话,用
    process.spawn("find", [filePath, "-type", "f", "-name", `*.${suffix}`)
    直接调 find 去找特定后缀的文件,上面这几个参数在 macOS 跟 Linux 下都不会遇到坑
    alanhe421
        5
    alanhe421  
    OP
       2022-03-28 09:57:47 +08:00
    @misdake 嗯,想了下,是这个理,我 return 换成对象类型,保存 match 结果及剩余匹配次数就行了,谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:32 · PVG 10:32 · LAX 18:32 · JFK 21:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.