【问题标题】:Given array, on even indexes make sure it goes up, on odd indexes down给定数组,偶数索引确保它上升,奇数索引下降
【发布时间】:2016-01-12 03:32:47
【问题描述】:

给定一个数组2 18 3 15 3 9 7 4,我想用一个函数递归地检查数组是否在偶数索引上上升,而在奇数索引上下降。 (顺便说一下,这个数组是排序的,我的代码返回false)

我做了什么:

我创建了一个函数来检查数组是否在偶数索引上上升并且它正在工作。我创建了另一个函数来检查数组是否在奇数索引上下降并且它不工作(返回零而不是一)。

我想要达到的目标:

[已解决] 1. 我想请教第二个函数的工作,因为它与第一个函数相似,所以它不起作用真的很奇怪。

在此功能上,我已将此行 if (num <= 0) 更改为 if (num <= 1)。现在已经排序了。

  1. 我只想创建一个函数,例如调用SortedUpDown 将同时递归检查数组是否在奇数索引上上升和在偶数索引上下降。

这是我的完整代码:

#include <stdio.h>
#include <stdlib.h> 
#include <conio.h>  

int SortedDown(int *arr, int num); 
int SortedUp(int *arr, int num);

int main(void)
{
    int sizeOfArr = 0, i = 0, *arr, num = 0, checkIfSortedDown = -1, checkIfSortedUp = -1;
    printf("Enter the size of the array : \n");
    scanf("%d", &sizeOfArr);
    printf("Enter %d numbers to the array \n: ", sizeOfArr);
    arr = (int *)malloc(sizeOfArr * sizeof(int));
    for (i = 0; i < sizeOfArr; i++)
    {
        scanf("%d", arr + i);
        printf("%d ", arr[i]);
    }
    puts("");
    checkIfSortedDown = SortedDown(arr, sizeOfArr);
    checkIfSortedUp = SortedUp(arr, sizeOfArr);
    if (checkIfSortedDown && checkIfSortedUp)
        puts("Sorted");
    else
        puts("Not Sorted");
    free(arr);
    getch();

    return 0;
}

int SortedDown(int *arr, int num) {
    --num;//size to last index
    if (num % 2 != 0) //if index is not even
        --num;
    if (num <= 0)
        return 1;//Sorted
    else if (arr[num - 2] > arr[num])
        return 0;//Not sorted
    else
        return SortedDown(arr, num - 2 + 1);//+1 : last index to size
}

int SortedUp(int *arr, int num) {
    --num;//size to last index
    if (num % 2 == 0)
        --num;
    if (num <= 0)
        return 1;//Sorted
    else if (arr[num - 2] < arr[num])
        return 0;//Not sorted
    else
        return SortedUp(arr, num - 2 + 1);//+1 : last index to size
}

【问题讨论】:

  • 为什么需要递归呢?
  • 您正在考虑将起始索引设为 1 还是 0?
  • 我的第一个问题的解决方案:在这个函数上,我已经将这一行 if (num &lt;= 0) 更改为 if (num &lt;= 1)。现在已经排序了。
  • @rkm_Hodor Ofcurse 0,但在 SortedUp 上,我只考虑 a[1]、a[3].. 等等。
  • @LeeTaylor 嗯,原因之一是,我想知道更好的递归。

标签: c arrays


【解决方案1】:

这是我对问题第二部分的解决方案:

int SortedUpDown(int * arr, int num) {
  if (num < 3) {
    return 1; // it's always sorted 
  }

  if (arr[0] > arr[2]) {
    return 0;
  }

  if (num > 3 && arr[1] < arr[3]) {
    return 0;
  }
  return SortedUpDown(arr + 2, num - 2);
}

【讨论】:

  • 萨沙,这太棒了!非常感谢!
  • 你不觉得“num > 3”没用吗?因为我看不出它是如何贡献的。
  • 哦,其实我知道它的作用。如果我们有 num = 3。那么如果我们检查 arr[3],它将进入数组的边界。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多