简体   繁体   English

将Pancake Sort的循环实现转换为递归实现

[英]Converting loop implementation of Pancake Sort to a recursive implementation

I am learning about recursion and wanted to convert my loops into a recursive function ? 我正在学习递归,并想将我的循环转换为递归函数? What should be the correct answer for this code be (Suppose that I already wrote the flip method to reverse elements in an array) ? 此代码的正确答案应该是什么(假设我已经编写了flip方法来反转数组中的元素)? Thanks, 谢谢,

/**
 * Sorts an array of integers by repeatedly reversing 
 * subranges within the array. Prints the flip sequence. 
 */ 
public static void  sort( int[] array)
{   
    int size = array.length;
    if (!Ordered(array, size)){
        for(int i = size-1; i > 0; i--)
        {
            int j = findMax(array, 0, i );
            int flipPosition;

            if( j != i )
            {
                if( j != 0 ) {
                    flip( array, 0, j );
                    flipPosition = size-j;
                    System.out.print( flipPosition + " " );
                }

                flip( array, 0, i );
                flipPosition = size-i;
                System.out.print( flipPosition + " " );
            }   
        }
    }
    System.out.println( 0 );
}

I didn't want to write your program if this is homework, or ruin your fun if this is personal, so I've implemented a heavily commented recursive solution in Ruby. 如果这是家庭作业,我不想编写您的程序,或者如果这是个人的,我不想破坏您的乐趣,因此我在Ruby中实现了一个受到广泛评论的递归解决方案。 It basically boils down to do the flips necessary to move the maximum element to the end of the array, then apply the same logic to the subarray created by excluding the max. 它基本上归结为进行必要的翻转,以将最大元素移到数组的末尾,然后将相同的逻辑应用于通过排除最大值而创建的子数组。 The recursive call returns the subarray sorted, so just append the max and pass the result back up the line. 递归调用返回排序后的子数组,因此只需追加max并将结果传递回该行即可。 Base case for the recursion is when you get down to a single element, just return it. 递归的基本情况是当您深入到单个元素时,只需将其返回即可。

# Function to find the index of the max element in an array.
# In case of ties, returns the lowest index
def max_index(a)
  a.each_index.inject { |memo, i| a[i] > a[memo] ? i : memo }
end

def pancake_sort(a)
  # An array with 0 or 1 elements is sorted (trivially),
  # just return it.  This is the base case for the recursion.
  return a if a.length < 2

  # Find location of the max, express it as the n'th element
  n = max_index(a) + 1

  # Flip the stack of the first n elements (max is last)
  # to put the max at the front, concatenate it with the
  # rest of the array, then flip the entire result.  This
  # will put max at the end. However, don't bother with all
  # that flipping if max was already at the end.
  a = (a.take(n).reverse + a.drop(n)).reverse if n < a.length

  # Recursively apply the logic to the subarray that excludes
  # the last (max) element.  When you get back the sorted
  # subarray, tack the max back onto the end
  return pancake_sort(a.take(a.length - 1)) << a[-1]
end

# Create an array of 20 random numbers between 0 and 99    
ary = Array.new(20) { rand(100) }
# Display the result
p ary
# Display the result after sorting
p pancake_sort(ary)

# Sample output:
# [70, 19, 95, 47, 87, 49, 53, 8, 89, 33, 22, 85, 91, 87, 99, 56, 15, 27, 75, 70]
# [8, 15, 19, 22, 27, 33, 47, 49, 53, 56, 70, 70, 75, 85, 87, 87, 89, 91, 95, 99]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM