Python - 如何将多重赋值更改为JavaScript的语法并获得给定字符串的正确排列

时间:2018-02-15 11:21:58

标签: javascript python math backtracking recursive-backtracking

我在搜索回溯方面遇到了一些问题。首先,在我下面的代码链接中,作为JavaScript程序员,我发现了一个非常奇怪的语法:

a[l], a[i] = a[i], a[l]

使用this page中的信息我发现它意味着:"将a[i]分配给a[l]变量,将a[l]分配给a[i]变量& #34 ;.我无法理解这个用法。我认为这将是相同的价值观。如果您首先将值分配给a[l],然后尝试获取a[l],那么对于这两个变量,它将变为a[i]

它是一个Python代码,但是,我想使用相同的原理将其转换为JavaScript。

# Python program to print all permutations with
# duplicates allowed

def toString(List):
    return ''.join(List)

# Function to print permutations of string
# This function takes three parameters:
# 1. String
# 2. Starting index of the string
# 3. Ending index of the string.
def permute(a, l, r):
    if l==r:
        print toString(a)
    else:
        for i in xrange(l,r+1):
            a[l], a[i] = a[i], a[l]
            permute(a, l+1, r)
            a[l], a[i] = a[i], a[l] # backtrack

# Driver program to test the above function
string = "aab"
n = len(string)
a = list(string)
permute(a, 0, n-1)

# This code is contributed by Bhavya Jain

您可以点击此指向IDE的链接:https://ide.geeksforgeeks.org/ASvO8MoGQr

这段代码的作用是获取字符串" aab"的排列值。

例如,使用" aab"作为第一个字符串,我们应该得到以下结果: aab ABA AAB ABA 咩 BAA

我尝试使用" JavaScript"并想出了这个:

let arr = [];

let permute = function(str, l, r) {
  if (l === r) {
    arr.push(str);
  } else {
    for (let i = l; i <= r; i++) {
      str[l] = str[i];
      str[i] = str[l];
      permute(str, l + 1, r);
      str[l] = str[i];
      str[i] = str[l];
    }
  }
};

permute('aab', 0, 'aab'.length - 1);

console.log(arr);

我得到的结果是["aab", "aab", "aab", "aab", "aab", "aab"]

链接到JSFiddle:https://jsfiddle.net/xrfkt9qj/1/

EDIT1 我已经尝试了@jp_data_analysis答案,但仍然会返回错误结果:https://jsfiddle.net/zurvm0xy/

EDIT2 ES6脚本版本:https://jsfiddle.net/zurvm0xy/4/

它不是重复的,变量交换只是这个问题的第一部分。请阅读完整的文章。

2 个答案:

答案 0 :(得分:2)

以下代码2段代码具有相同的结果,假设值是不可变的。

Python语法

a[i], a[j] = a[j], a[i]

常规语法

x = a[i]
y = a[j]

a[i] = y
a[j] = x

为什么会有效

Python首先评估右侧。有关详细信息,请参阅 Evaluation order

答案 1 :(得分:0)

最后,我想出了一切。最重要的部分是使用split()函数将字符串转换为数组。

let arr = [], y, x;

let permute = function(str, l, r) {
  if (l === r) {
    arr.push(str.join(''));
  } else {
    for (let i = l; i <= r; i++) {
      [str[l], str[i]] = [str[i], str[l]];
      permute(str, l + 1, r);
      [str[l], str[i]] = [str[i], str[l]];
    }
  }
};

permute('aab'.split(''), 0, 'aab'.length - 1)
console.log(arr);