Mus*_*ust 1 c arrays recursion function
我需要指导来理解我的逻辑在哪里不起作用。我需要编写一个递归函数,从用户输入接收数组 A 和数组 B。该函数正在检查数组是否颠倒。例如:A = {1, 4, 6, 7, 5, 3, 2},B = {2, 3, 5, 7, 6, 4, 1} 该函数将返回 1。如果它们不颠倒,该函数将返回 0。数组的大小无关紧要,因为 A 和 B 都相同。当我运行程序时,无论输入是什么,结果都是 0,即使输入正确(B 是相反的) A)。
int areReversed(int* A, int* B, int n)
{
if (n <= 0) return 1; // all elements have been compared and are equal
// Compare first element of array A and last element of array B
if (A[0] != B[n - 1])
return 0; // elements are not equal
// Recursively compare remaining elements of arrays A and B
return areReversed(A + 1, B - 1, n - 2);
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的代码。很想知道函数总是返回 0 的原因是什么以及我的逻辑失败的地方。在纸面上,从我所看到的来看,它应该有效。
我玩了一下,并将递归调用更改为 (A + 1, B, n - 1) 做了一些测试,它似乎有效。希望对这一变化有第二个意见,看看它是否完美,或者仍然有一些工作要做。在原始代码中,我将 n 减少太多,因此它跳过了 B 的一些元素,因此比较是错误的。
这段代码的问题是您传递了错误的基数B和错误的大小。
您正在if (A[0] != B[n - 1])比较第一个元素A与最后一个元素B(参考n数组的长度)。
因此,在下一次迭代中,您必须前进A1,但的基数B必须保持不变,并且大小也必须减小 1。所以正确的调用是return areReversed(A + 1, B, n - 1);.
如果你这样做:
#include <stdio.h>
int areReversed(int* A, int* B, int n)
{
if (n <= 0) return 1; // all elements have been compared and are equal
printf("checking %d and %d, n is %d\n", *A, B[n-1], n);
// Compare first element of array A and last element of array B
if (A[0] != B[n - 1])
return 0; // elements are not equal
// Recursively compare remaining elements of arrays A and B
return areReversed(A + 1, B, n - 1);
}
int main()
{
int a[] = {1,2,3,4,5};
int b[] = {5,4,3,2,1};
printf("Palindrom? %d\n", areReversed(a,b, sizeof a / sizeof *a));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到正确的结果:
$ ./a
checking 1 and 1, n is 5
checking 2 and 2, n is 4
checking 3 and 3, n is 3
checking 4 and 4, n is 2
checking 5 and 5, n is 1
Palindrom? 1
Run Code Online (Sandbox Code Playgroud)