// 這是一個檢查給定陣列是否通過遞回排序的函式
#include<iostream>
using namespace std;
bool sorted(int arr[],int n)
{
if(n==1)
{
return true;
}
當 n 達到 1 時,我在這里感到困惑,然后如果陣列未排序,它將回傳 true 到“restArray”,那么“restArray”將如何變為 false?
bool restArray = sorted(arr 1, n-1);
return (arr[0]<=arr[1] && restArray);
}
int main()
{
int arr[]={1,6,3,4,5};
cout<<sorted(arr,5);
return 0;
}
uj5u.com熱心網友回復:
在每個遞回中都有兩種情況
首先是簡單的情況if (n == 1):一個大小的陣列1(即只有一個元素)總是被排序的。因此它回傳true并停止遞回
如果n仍然大于1,則進行遞回呼叫并檢查沒有第一個元素的陣列是否已排序(bool restArray = sorted(arr 1, n-1)),然后檢查陣列的第一個元素是否小于第二個元素(a[0] < a[1])。(順便說一句,我可能會在<=這里檢查)最后你將這兩個檢查與&&.
因此,對于您的示例,它將在某個時間點進行檢查6 < 3,這將回傳,false因此整體結果將變為false.
但是為了優化,我建議對你的陳述句重新排序,這樣你就不需要遞回呼叫,如果陣列中前兩個元素的順序已經錯誤的話。正如@Scheff's Cat 在評論中提到的那樣:當您將其轉換為尾遞回時,任何優秀的編譯器都可以將該遞回重構為(便宜得多)迭代......
而且我還會檢查,n <= 1否則如果您的方法(錯誤地!)使用n = 0.
bool sorted(int arr[],int n)
{
if (n <= 1)
{
return true;
}
return arr[0] <= arr[1] && sorted(arr 1, n-1);
}
甚至更簡單
bool sorted(int arr[], int n) {
return n <= 1
? true
: arr[0] <= arr[1] && sorted(arr 1, n-1);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/434917.html
