- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在递归方面遇到了困难。我需要编写一个递归调用的函数来比较两个整数数组。该函数接收两个数组及其对应的长度。
数组包含数字。我的目标最终是将每个数组的所有项目移动到数组的第一个单元格,并让退出条件比较数组的前两个单元格。因为这是一个整数数组,所以我无法理解如何将数字从下一个单元格“连接”到前一个单元格,以及通常如何完成整个操作。我非常感谢您的回答或提示。
解释:
该函数将采用两个数组及其长度作为参数,例如 [123, 456, 7891] 和 [12345, 6, 78, 91]。我的函数需要返回这两个是否相等。
我的想法是,我以某种方式递归地将两个数组中的所有项相应地移动到第一个单元格,然后比较最终返回条件下的单元格,谢谢!
这显然可以用另一种方式来完成,对我来说,只要它有效,哪种方式都无所谓:D
[编辑]:
以下是一些可能的比较:
compare( [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]) => SAME
compare( [12, 34, 5], [1, 2, 3, 4, 5]) => SAME
compare( [12, 34, 5], [123, 45]) => SAME
compare( [1, 2], [5, 6]) => DIFFER
最佳答案
在这种情况下,我们不会检查数组是否相等(见下文),而是检查表示为字符串然后连接起来的数字是否相等。例如:
[1,2,3,4,5] === [12,34,5] === [123,45]
我们的想法是 reduce/fold在每个数组上,将表示的字符串作为我们的最终值,将空字符串作为我们的初始值,获取每个整数,将其转换为字符串,并将其连接到结果的末尾。然后我们发现自己有两个字符串,我们比较它们是否相等。
请注意,我的解决方案存在几个问题。
首先,我没有对字符串操作做任何边界检查,所以下面的代码将愉快地填满你的内存。
我们也不跟踪结果的结尾,这意味着每次连接都需要遍历结果字符串,这不是一种有效的方法。
给定的 itoa 实现的一个限制是它不能正确处理最大的负整数。
但总体思路保持不变。用一种很好的编程语言,你可以写:
(eq?
(reduce concat "" (map tostr [1,2,3,4,5] ))
(reduce concat "" (map tostr [1,2,3,4,5] )))
或等效的;但这是 C,所以我们必须用困难的方式来做:
#include <assert.h>
#include <string.h>
#define SAME 0
#define DIFFER 1
void reverse(char s[]);
void itoa(int n, char s[]);
void reduce_to_string(char *result, int values[], int values_len){
char tmpstr[256] = "";
if( values_len == 0 ){ return; }
// convert the first number to a string, writing the representation to tmpstr
itoa(values[0], tmpstr);
// concatenate the first number with the accumulated string
result = strcat(result, tmpstr);
// recur with a smaller array.
return reduce_to_string(result, &values[1], (values_len-1));
}
int compare_representation(int a[], int a_len, int b[], int b_len){
char a_as_string[512] = "";
char b_as_string[512] = "";
reduce_to_string(a_as_string, a, a_len);
reduce_to_string(b_as_string, b, b_len);
if( 0 == strcmp(a_as_string, b_as_string) ){ return SAME;}
return DIFFER;
}
int main(void){
int b[] = {6,7,8,9};
int b_len = 4;
int c[] = {1,2,3,4,5};
int c_len = 5;
int d[] = {67, 89};
int d_len = 2;
assert(SAME == compare_representation(b,b_len,d,d_len));
assert(DIFFER == compare_representation(b,b_len,c,c_len));
return 0;
}
/*
* The following are from K&R C, second edition.
*/
/* reverse: reverse string s in place. page 62 */
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
/* itoa: convert n to characters in s. page 64*/
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
如果您是 C 语言的新手,使用 &a[1]
作为数组 'a' 的尾部可能不太清楚。
(当我说尾部时,我指的是除第一个元素之外的所有其他元素。)
将其分解为英语 &a[1]
表示类似:“数组 'a' 中第二个值的地址”。为什么这行得通?因为在 C 语言中,数组只不过是指向用于存储变量的内存起始位置的指针,所以获取第二个变量的地址本质上就是一个少了一个元素的数组。为了确保我们考虑到数组更小,我们还减少了数组长度变量“a_len”,然后再将其传递给下一个函数调用。
两个 compare_*
函数都在两个整数数组之间进行比较,检查数组是否相同。
#include <assert.h>
#define SAME 0
#define DIFFER 1
int compare_recursive(int a[], int a_len, int b[], int b_len){
if( a_len != b_len ){ return DIFFER; }
if( a_len == 0 && b_len == 0 ){ return SAME; }
if(a[0] == b[0]){
return compare_recursive(&a[1], (a_len-1), &b[1], (b_len-1) );
}else{
return DIFFER;
}
}
int compare_iterative(int a[], int a_len, int b[], int b_len){
int i;
if( a_len != b_len ){ return DIFFER; }
for(i = 0; i < a_len; i++){
if( a[i] != b[i] ){ return DIFFER; }
}
return SAME;
}
int main(void){
int a[] = {1,2,3,4,5};
int a_len = 5;
int b[] = {6,7,8,9};
int b_len = 4;
int c[] = {1,2,3,4,5};
int c_len = 5;
assert(DIFFER == compare_recursive(a,a_len,b,b_len));
assert(SAME == compare_recursive(a,a_len,c,c_len));
assert(DIFFER == compare_iterative(a,a_len,b,b_len));
assert(SAME == compare_iterative(a,a_len,c,c_len));
return 0;
}
关于c - 如何递归地将整数数组的所有项移动到第一个单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198702/
我正在尝试学习 Fortran,并且看到了很多不同的定义,我想知道他们是否正在尝试完成同样的事情。以下有什么区别? 整数*4 整数(4) 整数(kind=4) 最佳答案 在 Fortran >=90
我以前从未编程过,最近(1 周前)才开始学习!第一门类(class)是函数式编程,使用 Haskell。 我有一项学校作业,我想通过删除一两个步骤来改进它,但我遇到了一个讨厌的错误。 基本上,我创建了
给定以下GraphQL请求和变量: 请求: query accounts($filter:AccountFilter, $first_:String, $skip_:Int) { accounts
我已经搜索了 StackOverflow,但找不到关于如何检查计算器应用程序的数字输入正则表达式的答案,该计算器应用程序将检查每个 keyup 的以下格式(jquery key up): 任何整数,例
类似于我上一篇致歉的文章,但没有那么长篇大论。基本上我想知道当每次重绘调用只重绘屏幕的一小部分时,优化重绘到 JFrame/JPanel 的最佳选择是什么。 此外,除了重绘重载之外,我并不是 100%
所以在我的教科书中有一个使用 f# 的递归函数的例子 let rec gcd = function | (0,n) -> n | (m,n) -> gcd(n % m,m);; 使用此功能,我的教科书
我有一个数据结构,例如表达式树或图形。我想添加一些“测量”功能,例如depth和 size . 如何最好地键入这些函数? 我认为以下三个变体的用处大致相同: depth :: Expr -> Int
这样写比较好 int primitive1 = 3, primitive2 = 4; Integer a = new Integer(primitive1); Integer b = new Inte
我是 Java 8 新手,想根据键对 Map 进行排序,然后在值内对每个列表进行排序。 我试图寻找一种 Java 8 方法来对键和值进行排序。HashMap>映射 map.entrySet().str
这就是我的目标... vector ,int> > var_name (x, pair (y),int>); 其中 x 是 vector var_name 的大小,y 是对内 vector 的大小。
这里是 an answer to "How do I instantiate a Queue object in java?" , Queue is an interface. You can't i
这个问题在这里已经有了答案: Weird Integer boxing in Java (12 个答案) Why are autoboxed Integers and .getClass() val
我们可以使用 C++ STL 做这样的事情吗?如果是,我将如何初始化元素?我试图这样做,但没有成功。 pair,vector>p; p.first[0]=2; 最佳答案 Can we do som
您好,我正在尝试为百分比和整数数组中的数字找到索引。假设 arraynum = ['10%','250','20%','500'] 并且用户发送一个值 15%,这个数字在哪个范围内居住?我可以使用这段
我与三列有关系:ProductName、CategoryID 和 Price。我需要选择仅那些价格高于给定类别中平均产品价格的产品。(例如,当apple(ProductName)是fruit(Cate
我已经坚持了一段时间,我正在尝试将一些数据配对在一起。这是我的代码。 #include #include using namespace std; int main() { pair data(
我收到错误:'(Int, Int)' 与 'CGPoint' 不相同 如何将 (Int, Int) 转换为 CGPoint let zigzag = [(100,100), (100,150)
我在 .cpp 文件中发现了以下代码。我不理解涉及头文件的构造或语法。我确实认识到这些特定的头文件与 Android NDK 相关。但是,我认为这个问题是关于 C++ 语法的一般问题。这些在某种程度上
我将这些输入到 Scala 解释器中: val a : Integer = 1; val b : Integer = a + 1; 我收到消息: :5: error: type mismatch;
C++:vector>v(size);当我试图打印出值时显示 0 作为值,但是当未声明 vector 大小时它显示正确的输出?为什么这样?例如: int x; cin>>x; vector>v(x);
我是一名优秀的程序员,十分优秀!