int i = 0;
int min = x[i];
while ( i < n ){
if ( x[i] < min ){
min = x[i];
}
i++;
}
return min;
我编写了迭代表单来查找数组的最小数量。但我想编写一个带递归的函数。请帮忙!
答案 0 :(得分:14)
因为这听起来像家庭作业,这里有一个提示:数组中的最小值是数组的第一个元素或 rest 中的最小数字,以较小者为准。
答案 1 :(得分:2)
单元素数组的最小数量是数组中的一个元素。
大小&gt;的数组的最小数量1是第一个元素的最小值,也是数组其余部分的最小值。
(未定义空数组的最小数量。)
答案 2 :(得分:2)
这不是最佳解决方案,因为您可以将递归调用的结果保存在int变量中,但我不允许在练习中使用。
无论如何,这个函数使用递归搜索int数组中的最小值。 首先,它通过检查大小是否等于1来检查数组中有多少元素,然后返回第一个值作为结果。如果表大于1(技术上也低于1),它会将数组中的最后一个值与数组其余部分的递归调用进行比较。
递归在0索引处停止,然后将该值与索引1进行比较。然后,它将索引0和1的最低值与索引3中的值进行比较,依此类推,直到达到最后一个值。
int minimum(int array[], int size) {
if (size == 1) {
return array[0];
}
else {
return (array[size] < minimum(array, size - 1))
? array[size]
: minimum(array, size - 1);
}
}
int array[5] = {5, 99, 205, 1, 15};
int smallest = minimum(array, 4); // 4 = index of the last element
我的练习中的规则:
答案 3 :(得分:1)
听起来像家庭作业,但你最好的选择是这样的:
int main(void) {
int size = 2;
int test[] = {0,1};
int min = test[0];
findMin(&min, test, size);
printf("%d", min);
}
void findMin(int* min, int* test, int* length);
void findMin(int* min, int* test, int* length) {
if (length >= 0) {
if (*test < *min) {
*min = test;
}
findMin(min, test++, (*length)--);
}
}
答案 4 :(得分:1)
这是一个返回指向最小值的指针的函数:
#include <stddef.h>
int *recursiveMin(int *x, int n) {
if (x == NULL || n == 0)
return NULL;
if (n == 1)
return x;
int *t = recursiveMin(x + 1, n - 1);
return *x < *t ? x : t;
}
答案 5 :(得分:1)
递归的一般规则是避免“小步骤” - 所以“第一个元素与数组的其余部分相比”是非常糟糕的主意。尝试将数组处理成两半,如下所示:
min( array ) {
if size of array == 1 return array[0]
else if size of array == 2 return array[0] < array[1] ? array[0] : array[1]
else {
firstmin = min( firsthalf) // stored to avoid double calls
secondmin = min( secondhalf)
firstmin < second_min ? firstmin : secondmin
}
}
进一步优化:
- 避免数组副本 - 考虑使用类似quicksort的签名(array,from,to)
- 避免递归调用大小&lt; 2
答案 6 :(得分:0)
为什么要用递归来做这个?递归的一般规则是,如果可以在简单的线性循环中执行,则不要使用递归。
答案 7 :(得分:0)
尝试:
int recursive_min(list<int> arr) {
return recursive_min(arr);
}
虽然这在命令式语言中不起作用。
更严肃的答案是伪代码:
func recursive_min( list l ) {
head = l[1]
tail = l[2<->end]
if l.length==1 return head else return min(head,recursive_min(tail))
}
虽然如果l为空,这不起作用。
答案 8 :(得分:0)
const int = 20;
int getmin (int v[], int n);
main ()
{
int v[N];
int i,n,min;
printf("\n\tType number of elements:\t");
scanf("%d",&n);
for (i=0;i<n;i++)
{
printf("\nv[%d]:\t",i);
scanf("%d",&v[i]);
}
min = getmin (v,n);
printf("\n\n\tMinimume value is %d.",min);
}
int getmin (int v[],int n)
{
if (n>0)
{
if ( v[n-2] > v[n-1] )
{
v[n-2]=v[n-1];
}
getmin (v,n-1);
}
return v[n-2];
}
答案 9 :(得分:0)
int findMin(int a[], int len) {
// normal version
// if (len==1) return a[0];
// return (a[len-1] < findMin(a,len-1))? a[len-1] : findMin(a,len-1);
// memoization version, sort of?
int rightside;
if (len==1) return a[0];
rightside = findMin(a,len-1);
return (a[len-1] < rightside)? a[len-1] : rightside;
}
答案 10 :(得分:0)
#include <iostream>
#include <cstdlib>
using namespace std;
int min(int [], int);
void mostrar(int [], int);
int main() {
int f[] = {4, 9, 0, -1, 5, 8, -3, 6, -4, 0};
int t = sizeof(f)/sizeof(int);
cout << "\nEl valor m\xa1nimo para los valores:\n";
mostrar(f, t);
cout << "\nes: " << min(f, t);
system("pause>nul");
}
int min(int x[], int p) {
if (p == 1)
return x[0];
int aux = min(x+1, p-1);
return x[0] < aux ? x[0] : aux;
}
void mostrar(int v[], int k) {
if (k > 1)
mostrar(v, k-1);
cout << v[k-1] << " ";
}