【问题标题】:Many nested `for` cycles depending on a variable许多嵌套的“for”循环取决于变量
【发布时间】:2011-01-25 11:43:51
【问题描述】:

我想根据变量中的值将尽可能多的 for 循环放入其中。
比如变量@var = 1,我需要执行:

for letter1 in @range
  do something
end

如果变量@var = 2

for letter1 in @range
  for letter2 in @range
    do something
  end
end 

如果变量@var = 3

for letter1 in @range
  for letter2 in @range
    for letter3 in @range
      do something
    end
  end
end 

有没有比下面的代码更聪明/更少的代码方式?我不想再重复一遍。

if @var == 1
  for letter2 in @range
    do something
  end
elsif @var == 2
  for letter1 in @range
    for letter2 in @range
      do something
    end
  end
elsif @var == 3
  for letter1 in @range
    for letter2 in @range
      for letter3 in @range
        do something
      end
    end
  end 
end

do something 部分在每种情况下始终相同。区别仅在于它的周期数。

【问题讨论】:

    标签: ruby recursion nested-loops


    【解决方案1】:

    你应该阅读递归:http://en.wikipedia.org/wiki/Recursion_(computer_science)
    是这样的:

    def f(depth,letters=[])
      if depth == 0
        do someting with letters
      else
        for letter in @range
          f(depth-1,letters+[letter])
        end
      end
    end
    
    f(@var)
    

    f 是一个函数,它通过字母再次递归调用自身。每个调用都有信息depth,这意味着递归应该有多深。

    【讨论】:

    • 我理论上知道什么是递归,但我需要在代码的“做某事”部分中使用这些循环变量(上面代码中的字母 1、字母 2、字母 3 等)。有了这个解决方案,有没有办法做到这一点?该脚本将所有可能的字符串组合与@var 长度和来自@range 的字母相结合。感谢您的回答。
    • @Kreeki, letters 是一个带有字母的数组 - 每个字母都由+[letter] 添加到数组中。它创建新的更长的数组并将其发送到递归调用的函数。
    【解决方案2】:
    @range.map{|x| x}.product(*([@range.map{|x| x}] * n)) do |*args|
      do_something_with(*args)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多